Inout参数不具有相同的地址

时间:2015-12-10 21:13:01

标签: ios swift pass-by-pointer inout

我有三个类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")
    }
}

为什么会出现这种情况?

1 个答案:

答案 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功能。