在Swift中,值类型是否等效于passUnretained()?

时间:2019-01-03 12:41:33

标签: ios swift macos

我正在尝试做一些基本的证明,因此,我希望能够获得变量和常量的存储位置。

这是我正在看的那种简单例子:

import Foundation

class A {
    var a: Int = 0
    let b: Int = 3

    var description: String {
        return "a: is \"\(a)\", b is \"\(b)\""
    }
}

struct B {
    var a: Int = 0
    let b: Int = 3

    var description: String {
        return "a: is \"\(a)\", b is \"\(b)\""
    }
}

let classInstance = A()
let structInstance = B()

print(Unmanaged.passUnretained(classInstance).toOpaque())
print(Unmanaged.passUnretained(structInstance).toOpaque())

问题出在第二个print(Unmanaged.passUnretained(structInstance).toOpaque())

有人告诉我不能传入struct常量。

公平的鼻子。 The docs say这样:

声明

static func passUnretained(_ value: Instance) -> Unmanaged<Instance>

参数

  • 一个类实例。

返回值 对作为值传递的对象的非托管引用。

如您所见,它坚持使用一个类实例。

我的问题是,我也希望能够查看该结构的内存地址。

这样做的原因是,我试图创建一个游乐场,以说明如果更改成员var整个结构如何移动。

我正在使用Swift 4.2。

编辑

啊。现在我记得了。

使用let(常数)实例化这些值很重要。整个想法是表明修改数据成员时会复制实际的结构。

我们假定以上所有条件成立,直到两个let声明为止:

withUnsafePointer(to: classInstance) { print("value \(classInstance) has address: \($0)") }
withUnsafePointer(to: structInstance) { print("value \(structInstance) has address: \($0)") }

有效,但两者显示的地址相同:

value __lldb_expr_5.A has address: 0x00007ffee462ed38
value B(a: 0, b: 3) has address: 0x00007ffee462ed38

如果我尝试发送参考:

withUnsafePointer(to: &classInstance) { print("value \(classInstance) has address: \($0)") }
withUnsafePointer(to: &structInstance) { print("value \(structInstance) has address: \($0)") }

我被编译器大喊大叫。基本上是马丁写的这个问题。

0 个答案:

没有答案