我有三個類A,B和C.A有一個名爲rA的資源。我試圖實現的是所有這些實例都提供了完全相同的資源。輸入參數沒有相同的地址
所以要在夫特術語混凝土:
類A具有叫做foo屬性:
private var foo : [Bar] = [Bar]() // shared resource
B類具有被傳遞到初始化作爲一個INOUT參數的屬性叫做foo :
private var foo : [Bar]!
init(inout foo:[Bar]){
self.foo = foo
}
柯樂s C類似於B類
爲什麼如果我將foo
從A類傳遞到B類(或C),地址會發生變化?
在AI將它傳遞給B(或C),像這樣:
let b = B(foo: &self.foo)
當我打印A的foo
初始化之後它給我在B.
class A{
private var foo = [Bar]()
func someFunc(){
NSLog("\n\n [A] \(unsafeAddressOf(self.foo))\n\n") // different from output in B
let b = B(foo: &self.foo)
}
}
class B{
private var foo: [Bar]!
init(inout foo: [Bar]){
self.foo = foo
NSLog("\n\n [B] \(unsafeAddressOf(self.foo))\n\n")
}
}
任何想法爲什麼這種情況?
'unsafeAddressOf()'接受一個'AnyObject'參數,因此在你的情況下,類型爲'[Bar]'的Swift數組被橋接到一個'NSArray'。重複完成此橋接可能會導致或不會導致相同的對象。 –
@MartinR謝謝,這是有道理的。有沒有其他方法可以檢查他們是否引用同一個對象? –
請注意,Swift數組是* value類型*和'self.foo = foo'「複製」數組(即使實際元素只是按需複製)。 - 如果你需要一個可以傳遞的實參*,那麼你可以將這個數組包裝在一個'class'中。或者使用'NS(可變)數組',但是你失去了許多Swift特性。 –