我有三个类A,B和C.A有一个名为rA的资源。我想要实现的是所有这些实例都引用了完全相同的资源。
所以对于Swift术语的具体内容:
A类有一个名为foo的属性:
private var foo : [Bar] = [Bar]() // shared resource
B类有一个名为foo的属性,它作为inout参数传递给初始值设定项:
private var foo : [Bar]!
init(inout foo:[Bar]){
self.foo = foo
}
C类类似于B类
为什么如果我将foo
从A类传递到B类(或C),地址会发生变化?
在A中我会将它传递给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 :(得分:3)
Swift数组是值类型,因此在
中self.foo = foo
您将foo
的值分配给self.foo
。现在这是两个独立的阵列
(即使仅在其中一个数组发生变异时才复制实际元素。)
此外,您无法使用unsafeAddressOf()
获取Swift数组的地址,因为
该函数采用AnyObject
参数,该参数是类的实例,即
值类型。在
unsafeAddressOf(self.foo)
Swift编译器实际上将Swift数组桥接到NSArray
。如所示
在Swift, Strings and Memory Addresses中,
重复完成时,这可能会也可能不会产生相同的对象。在任何情况下,
打印的地址不 Swift数组的存储位置。
如果你需要一个可以传递的真实引用,那么你可以将数组包装在一个类中。
使用NS(Mutable)Array
也可能是一个选项,但是你失去了许多Swift功能。