将UnsafeMutableRawPointer转换为UInt64

时间:2019-03-23 11:53:47

标签: swift compiler-errors swift4

我有一个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转换为整数(以其他方式(但不是太可笑,如字符串解析))转换为整数?

1 个答案:

答案 0 :(得分:1)

(U)Int在所有平台(32位或64位)上都具有指针的大小,因此您始终可以在Unsafe(Mutable)(Raw)PointerIntUInt之间进行转换:< / 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位平台上,UIntUInt64都是不同的类型。)

如果您需要UInt64,那么

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

起到了作用。