Swift 将UnsafeMutableRawPointer转换为UInt64
我有一个UnsafemtableRawPointer的实例,希望检索它的intenger表示。我正在尝试使用以下代码:Swift 将UnsafeMutableRawPointer转换为UInt64,swift,compiler-errors,swift4,Swift,Compiler Errors,Swift4,我有一个UnsafemtableRawPointer的实例,希望检索它的intenger表示。我正在尝试使用以下代码: let pointer : UnsafeMutableRawPointer? = address(of: self) let intRepresentation : UInt64 = UInt64(bitPattern: pointer) 但Swift编译器引发错误:“无法将类型为'UnsafemtableRawPointer'的值转换为预期的参数类型'Int64'” 声明为
let pointer : UnsafeMutableRawPointer? = address(of: self)
let intRepresentation : UInt64 = UInt64(bitPattern: pointer)
但Swift编译器引发错误:“无法将类型为'UnsafemtableRawPointer'的值转换为预期的参数类型'Int64'”
声明为public init(位模式指针:unsafemtablerawpointer?
的构造函数是Swift.Math.Integers.UInt
此外,它在同一个文件中有public init(位模式x:Int64)
如何使这段代码工作或以任何其他方式(但不是太可笑,如字符串解析)将unsafemtablerawpointer转换为整数?(U)Int
在所有平台上都有指针大小(32位或64位),因此您始终可以在不安全(可变)(Raw)之间进行转换指针
和Int
或UInt
:
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位平台上,UInt
和UInt64
也是不同的类型。)
如果您需要UInt64
,则
let intRepresentation = UInt64(bitPattern:Int64(Int(bitPattern: pointer)))
这就是诀窍。如果指针超过Int类型,会发生什么?它会悄悄地截断值或抛出某种异常?Int(bitPattern:…)对我来说已经足够好了,我正在下一行返回
Int(truncatingIfNeeded:intRepresentation)
,好吧,它永远不会超过Int:///在32位平台上,Int
与Int32
的大小相同,在64位平台上,//,Int
与Int64
@Krypt的大小相同:Int
始终与指针的大小相同,但是Int
不一定与Int64
的大小相同。那么,唯一未解决的谜团就是为什么原始代码无法编译?@Krypt:Int
(还有我刚才注意到的UInt
)让初始值设定项接受指针参数。但是UInt64
没有这样的初始值设定项。即使UInt和UInt64具有相同的大小,它们也是不同的类型。