将 UnsafeMutableRawPointer 转换为 UInt64

Convert UnsafeMutableRawPointer to UInt64

我有一个 UnsafeMutableRawPointer 实例,想检索它的整数表示形式。我正在尝试使用以下代码:

let pointer : UnsafeMutableRawPointer? = address(of: self)
let intRepresentation : UInt64 = UInt64(bitPattern: pointer)

但是 Swift 编译器抛出错误:"Cannot convert value of type 'UnsafeMutableRawPointer?' to expected argument type 'Int64'"

声明为 public init(bitPattern pointer: UnsafeMutableRawPointer?) 的构造函数是 Swift.Math.Integers.UInt 它在同一个文件中也有 public init(bitPattern x: Int64)

我如何才能使这段代码工作或将 UnsafeMutableRawPointer 转换为整数以任何其他方式(但不要太荒谬,如字符串解析)?

(U)Int 在所有平台(32 位或 64 位)上都具有指针的大小,因此您始终可以在 Unsafe(Mutable)(Raw)PointerIntUInt 之间进行转换:

let pointer: UnsafeRawPointer? = ...
let intRepresentation = UInt(bitPattern: pointer) 
let ptrRepresentation = UnsafeRawPointer(bitPattern: intRepresentation)
assert(ptrRepresentation == pointer)

您的代码

let intRepresentation = UInt64(bitPattern: pointer) 

不编译,因为 UInt64 有一个接受指针参数的初始化程序,这是因为指针可以是 32 位或 64 位。 (即使在 64 位平台上,UIntUInt64 也是不同的类型。)

如果你需要UInt64那么

let intRepresentation = UInt64(bitPattern:Int64(Int(bitPattern: pointer)))

成功了。