Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将UnsafeMutableRawPointer转换为UInt64_Swift_Compiler Errors_Swift4 - Fatal编程技术网

Swift 将UnsafeMutableRawPointer转换为UInt64

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'” 声明为

我有一个UnsafemtableRawPointer的实例,希望检索它的intenger表示。我正在尝试使用以下代码:

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具有相同的大小,它们也是不同的类型。