输入参数没有相同的地址
问题描述:
我有三个类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")
}
}
任何想法为什么这种情况?
答
夫特阵列值类型,因此在
self.foo = foo
你的foo
的值分配给self.foo
。这是两个独立的数组,现在是 (即使仅在其中一个数组发生了变异时才复制实际元素)。
您也可以不采取夫特数组的地址与unsafeAddressOf()
因为 该函数采用一个AnyObject
参数是一个类的一个实例,即一个 值类型。在
unsafeAddressOf(self.foo)
Swift编译器实际上桥接Swift数组到NSArray
。如 在Swift, Strings and Memory Addresses, 中所示,当重复完成时,这可能会或可能不会导致相同的对象。无论如何, 的打印地址是而不是 Swift数组的存储位置。
如果您需要一个可以传递的真实参考,那么您可以将该数组包装到一个类中。 使用NS(Mutable)Array
也可能是一个选项,但是会丢失许多Swift功能。
'unsafeAddressOf()'接受一个'AnyObject'参数,因此在你的情况下,类型为'[Bar]'的Swift数组被桥接到一个'NSArray'。重复完成此桥接可能会导致或不会导致相同的对象。 –
@MartinR谢谢,这是有道理的。有没有其他方法可以检查他们是否引用同一个对象? –
请注意,Swift数组是* value类型*和'self.foo = foo'“复制”数组(即使实际元素只是按需复制)。 - 如果你需要一个可以传递的实参*,那么你可以将这个数组包装在一个'class'中。或者使用'NS(可变)数组',但是你失去了许多Swift特性。 –