¿Cómo puedo get la dirección de memory de un tipo de valor o una estructura personalizada en Swift?

Estoy tratando de get una comprensión más profunda de cómo Swift copy types de valor :

El comportamiento que ve en su código siempre será como si se hubiera realizado una copy. Sin embargo, Swift solo realiza una copy real detrás de escena cuando es absolutamente necesario hacerlo.

Para avanzar mi comprensión, me gustaría get la dirección de memory de un tipo de valor. Intenté unsafeAddressOf (), pero esto no funciona con estructuras y parece convertir los types de biblioteca estándar de Swift en types de reference (por ejemplo, String se convierte en NSString).

¿Cómo puedo get la dirección de memory de un tipo de valor, como una instancia de Int o una estructura personalizada en Swift?

De acuerdo con la respuesta de Martin R

addressOf () no se puede usar con variables de estructura. La cadena es una estructura, sin embargo, se puentea automáticamente a NSString cuando se pasa a una function que espera un object.

De acuerdo con la respuesta de nschum, puede get la dirección (stack) de una estructura , un tipo de construcción o una reference de object como esta:

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" 

Una cosa que encontré es, si myStruct no tiene valor, la dirección se mantendrá igual:

 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:

Puede usar este unsafeAddressOf(someObject)

o en Swift 3.0:

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

No estoy seguro si hay una forma "recomendada" de hacerlo, pero un método es usar withUnsafePointer(_:_:) , así:

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

Esto impreso 0x00007ffff52a011c8 en mi máquina.