我怎样才能在Swift中获取值types或自定义结构的内存地址?

我试图深入了解Swift如何复制值types :

您在代码中看到的行为将始终像发生副本一样。 但是,当绝对必要的时候,Sw​​ift只能在幕后执行一个实际的副本。

为了提高我的理解,我想获得一个值types的内存地址。 我尝试unsafeAddressOf(),但这不适用于结构,它似乎将Swift的标准库types转换为引用types (例如,string转换为NSString)。

我怎样才能得到一个值types的内存地址,像一个Int的实例,或在Swift中的自定义结构?

根据马丁R的回答

addressOf()不能和结构variables一起使用。 string是一个结构,但是,它被自动桥接到NSString时,传递给一个函数期待一个对象。

根据nschum的回答,你可以得到一个结构 ,内buildtypes或对象引用的(堆栈)地址,如下所示:

import UIKit func address(o: UnsafePointer<Void>) -> Int { return unsafeBitCast(o, Int.self) } func addressHeap<T: AnyObject>(o: T) -> Int { return unsafeBitCast(o, Int.self) } struct myStruct { var a: Int } class myClas { } //struct var struct1 = myStruct(a: 5) var struct2 = struct1 print(NSString(format: "%p", address(&struct1))) // -> "0x10f1fd430\n" print(NSString(format: "%p", address(&struct2))) // -> "0x10f1fd438\n" //String var s = "A String" var aa = s print(NSString(format: "%p", address(&s))) // -> "0x10f43a430\n" print(NSString(format: "%p", address(&aa))) // -> "0x10f43a448\n" //Class var class1 = myClas() var class2 = class1 print(NSString(format: "%p", addressHeap(class1))) // -> 0x7fd5c8700970 print(NSString(format: "%p", addressHeap(class2))) // -> 0x7fd5c8700970 unsafeAddressOf(class1) //"UnsafePointer(0x7FD95AE272E0)" unsafeAddressOf(class2) //"UnsafePointer(0x7FD95AE272E0)" //Int var num1 = 55 var num2 = num1 print(NSString(format: "%p", address(&num1))) // -> "0x10f1fd480\n" print(NSString(format: "%p", address(&num2))) // -> "0x10f1fd488\n" 

我发现的一件事是,如果myStruct没有值,地址将保持不变:

 struct myStruct { } var struct1 = myStruct() var struct2 = struct1 print(NSString(format: "%p", address(&struct1))) // -> ""0xa000000000070252\n"" print(NSString(format: "%p", address(&struct2))) // -> ""0xa000000000070252\n"" 

Swift 2.0:

你可以使用这个unsafeAddressOf(someObject)

或者在Swift 3.0中:

使用withUnsafePointer(to: someObejct) { print("\($0)") }

我不知道是否有一个“推荐”的方式来做到这一点,但一种方法是使用withUnsafePointer(_:_:) ,就像这样:

 var s: String = "foo" withUnsafePointer(&s) { NSLog("\($0)") } 

这在我的机器上打印0x00007ffff52a011c8