2015-12-10 80 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功能。

相关问题