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

ale*_*son 14 swift

在Objective-C中,这很简单:

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

我怎么能在Swift中做到这一点?

ale*_*son 31

func hashString (obj: AnyObject) -> String {
  return String(ObjectIdentifier(obj).uintValue)
}

let id = hashString(obj)
Run Code Online (Sandbox Code Playgroud)

Swift 3.0

return String(UInt(ObjectIdentifier(obj))
Run Code Online (Sandbox Code Playgroud)

Swift 4.1

return String(UInt(bitPattern: ObjectIdentifier(obj)))
Run Code Online (Sandbox Code Playgroud)

  • 是否记录了`ObjectIdentifier`的hashValue是唯一的而不仅仅是一个哈希值? (4认同)

new*_*cct 8

直接翻译怎么样:

func pointerToString(objRef: NSObject) -> String {
  return NSString(format: "%p", objRef)
}
Run Code Online (Sandbox Code Playgroud)

更原生的方式(十进制,不是十六进制):

func pointerToString(objRef: AnyObject) -> String {
  return withObjectAtPlusZero(objRef, { ptr in
    "\(UnsafePointer<RawByte>(ptr) - nil)"
  })
}
Run Code Online (Sandbox Code Playgroud)

func pointerToString(objRef: AnyObject) -> String {
  let ptr: COpaquePointer =
    Unmanaged<AnyObject>.passUnretained(objRef).toOpaque()
  return "\(UnsafePointer<RawByte>(ptr) - nil)"
}
Run Code Online (Sandbox Code Playgroud)

更新:指针现在正确字符串化,所以你可以这样做

func pointerToString(objRef: AnyObject) -> String {
  let ptr: COpaquePointer =
    Unmanaged<AnyObject>.passUnretained(objRef).toOpaque()
  return "\(ptr)"
}
Run Code Online (Sandbox Code Playgroud)