在Objective-C中,这很简单:
[NSString stringWithFormat:@"%p", objRef]
如何在Swift中执行此操作?
答案 0 :(得分:30)
func hashString (obj: AnyObject) -> String {
return String(ObjectIdentifier(obj).uintValue)
}
let id = hashString(obj)
Swift 3.0
return String(UInt(ObjectIdentifier(obj))
Swift 4.1
return String(UInt(bitPattern: ObjectIdentifier(obj)))
答案 1 :(得分:8)
直接翻译怎么样:
func pointerToString(objRef: NSObject) -> String {
return NSString(format: "%p", objRef)
}
更原生的方式(十进制,不是十六进制):
func pointerToString(objRef: AnyObject) -> String {
return withObjectAtPlusZero(objRef, { ptr in
"\(UnsafePointer<RawByte>(ptr) - nil)"
})
}
func pointerToString(objRef: AnyObject) -> String {
let ptr: COpaquePointer =
Unmanaged<AnyObject>.passUnretained(objRef).toOpaque()
return "\(UnsafePointer<RawByte>(ptr) - nil)"
}
更新:指针现在正确串化,所以你可以做到
func pointerToString(objRef: AnyObject) -> String {
let ptr: COpaquePointer =
Unmanaged<AnyObject>.passUnretained(objRef).toOpaque()
return "\(ptr)"
}
答案 2 :(得分:0)
你可以做些什么来解决这个错误:
func pointerToString<T> (ptr: CMutablePointer<T>) -> String {
// ...
}
但是 Swift 中无法打印实际指针。
答案 3 :(得分:-1)
你不能。 Swift中的本机String是一个对象,其内存布局与CMutablePointer地址中的内存内容不同且不透明。所以你不能把一个分配到另一个。另一种方法是分配/复制已使用指针地址处的内存内容初始化的NSString。