获取给定AnyObject的唯一字符串?

时间:2014-06-12 15:34:02

标签: swift

在Objective-C中,这很简单:

[NSString stringWithFormat:@"%p", objRef]

如何在Swift中执行此操作?

4 个答案:

答案 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。