2015-12-10 74 views
2

我有三個類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") 
    } 
} 

任何想法爲什麼這種情況?

+0

'unsafeAddressOf()'接受一個'AnyObject'參數,因此在你的情況下,類型爲'[Bar]'的Swift數組被橋接到一個'NSArray'。重複完成此橋接可能會導致或不會導致相同的對象。 –

+0

@MartinR謝謝,這是有道理的。有沒有其他方法可以檢查他們是否引用同一個對象? –

+0

請注意,Swift數組是* value類型*和'self.foo = foo'「複製」數組(即使實際元素只是按需複製)。 - 如果你需要一個可以傳遞的實參*,那麼你可以將這個數組包裝在一個'class'中。或者使用'NS(可變)數組',但是你失去了許多Swift特性。 –

回答

3

夫特陣列值類型,因此在

self.foo = foo 

你的foo分配給self.foo。這是兩個獨立的數組,現在是 (即使僅在其中一個數組發生了變異時才複製實際元素)。

您也可以不採取夫特數組的地址與unsafeAddressOf()因爲 該函數採用一個AnyObject參數是一個類的一個實例,即一個 值類型。在

unsafeAddressOf(self.foo) 

Swift編譯器實際上橋接Swift數組到NSArray。如 在Swift, Strings and Memory Addresses, 中所示,當重複完成時,這可能會或可能不會導致相同的對象。無論如何, 的打印地址是而不是 Swift數組的存儲位置。

如果您需要一個可以傳遞的真實參考,那麼您可以將該數組包裝到一個類中。 使用NS(Mutable)Array也可能是一個選項,但是會丟失許多Swift功能。

相關問題