我有三个类 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")
}
}
有什么想法为什么会出现这种情况吗?
最佳答案
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 功能。
关于ios - Inout 参数没有相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211831/