是否有任何方式来模拟[NSString stringWithFormat:@“%p”,myVar],从Objective-C,在新的Swift语言?
例如:
let str = "A String"
println(" str value \(str) has address: ?")
是否有任何方式来模拟[NSString stringWithFormat:@“%p”,myVar],从Objective-C,在新的Swift语言?
例如:
let str = "A String"
println(" str value \(str) has address: ?")
当前回答
其他答案都很好,尽管我正在寻找一种方法来获取整数形式的指针地址:
let ptr = unsafeAddressOf(obj)
let nullPtr = UnsafePointer<Void>(bitPattern: 0)
/// This gets the address of pointer
let address = nullPtr.distanceTo(ptr) // This is Int
只是跟进一下。
其他回答
其他答案都很好,尽管我正在寻找一种方法来获取整数形式的指针地址:
let ptr = unsafeAddressOf(obj)
let nullPtr = UnsafePointer<Void>(bitPattern: 0)
/// This gets the address of pointer
let address = nullPtr.distanceTo(ptr) // This is Int
只是跟进一下。
斯威夫特5
extension String {
static func pointer(_ object: AnyObject?) -> String {
guard let object = object else { return "nil" }
let opaque: UnsafeMutableRawPointer = Unmanaged.passUnretained(object).toOpaque()
return String(describing: opaque)
}
}
用法:
print("FileManager.default: \(String.pointer(FileManager.default))")
// FileManager.default: 0x00007fff5c287698
print("nil: \(String.pointer(nil))")
// nil: nil
注意:这是针对引用类型的。
斯威夫特:4/5
print(Unmanaged.passUnretained(someVar).toOpaque())
打印someVar的内存地址。 (感谢@Ying)
斯威夫特3.1:
print(Unmanaged<AnyObject>.passUnretained(someVar as AnyObject).toOpaque())
打印someVar的内存地址。
引用类型:
获取引用类型的内存地址是有意义的,因为它表示标识。 ===标识运算符用于检查两个对象是否指向同一个引用。 使用ObjectIdentifier获取内存地址
代码:
class C {}
let c1 = C()
let c2 = c1
//Option 1:
print("c1 address: \(Unmanaged.passUnretained(c1).toOpaque())")
//Option 2:
let o1 = ObjectIdentifier(c1)
let o2 = ObjectIdentifier(c2)
print("o1 -> c1 = \(o1)")
print("o2 -> c2 = \(o2)")
if o1 == o2 {
print("c1 = c2")
} else {
print("c1 != c2")
}
//Output:
//c1 address: 0x000060c000005b10
//o1 -> c1 = ObjectIdentifier(0x000060c000005b10)
//o2 -> c2 = ObjectIdentifier(0x000060c000005b10)
//c1 = c2
值类型:
获取值类型的内存地址的需求并不太重要(因为它是一个值),重点将更多地放在值的相等性上。
斯威夫特2
这现在是标准库的一部分:unsafeAddressOf。
/// Return an UnsafePointer to the storage used for `object`. There's
/// not much you can do with this other than use it to identify the
/// object
斯威夫特3
对于Swift 3,使用withUnsafePointer:
var str = "A String"
withUnsafePointer(to: &str) {
print(" str value \(str) has address: \($0)")
}