我有一个UnsafeMutableRawPointer实例,想要检索它的整数表示。我正在尝试使用以下代码:
let pointer : UnsafeMutableRawPointer? = address(of: self)
let intRepresentation : UInt64 = UInt64(bitPattern: pointer)
但是Swift编译器抛出错误:“无法转换'UnsafeMutableRawPointer类型的值?”到预期的参数类型'Int64'“
声明为public init(bitPattern pointer: UnsafeMutableRawPointer?)
的构造方法是Swift.Math.Integers.UInt
它在同一文件中也有public init(bitPattern x: Int64)
如何使此代码正常工作或将UnsafeMutableRawPointer转换为整数(以其他方式(但不是太可笑,如字符串解析))转换为整数?
答案 0 :(得分:1)
(U)Int
在所有平台(32位或64位)上都具有指针的大小,因此您始终可以在Unsafe(Mutable)(Raw)Pointer
和Int
或UInt
之间进行转换:< / p>
let pointer: UnsafeRawPointer? = ...
let intRepresentation = UInt(bitPattern: pointer)
let ptrRepresentation = UnsafeRawPointer(bitPattern: intRepresentation)
assert(ptrRepresentation == pointer)
您的代码
let intRepresentation = UInt64(bitPattern: pointer)
之所以无法编译,是因为UInt64
的 not 没有带有指针参数的初始化程序,这是因为指针可以是32位或64位。 (甚至在64位平台上,UInt
和UInt64
都是不同的类型。)
如果您需要UInt64
,那么
let intRepresentation = UInt64(bitPattern:Int64(Int(bitPattern: pointer)))
起到了作用。