我正在尝试做一些基本的证明,因此,我希望能够获得变量和常量的存储位置。
这是我正在看的那种简单例子:
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)") }
我被编译器大喊大叫。基本上是马丁写的这个问题。