swift - 将 UnsafeMutableRawPointer 转换为 UInt64

标签 swift compiler-errors swift4

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

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

但是 Swift 编译器抛出错误:“无法转换‘UnsafeMutableRawPointer’类型的值?”预期参数类型“Int64””

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

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

最佳答案

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

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)))

成功了。

关于swift - 将 UnsafeMutableRawPointer 转换为 UInt64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55313453/

相关文章:

iOS 中的 c++ try/catch 无知

android - 内核 c 多重函数定义错误

ios - 如何在 swift 4 中正确使用选择器

ios - 进入后台保存数据 - ResearchKit

java - “找不到符号”或“无法解析符号”错误是什么意思?

ios - 使用 "required init?(coder aDecoder: NSCoder)"进行 IBOutlets 初始化时会遇到任何问题吗?如果是,有什么例子?

ios - 在 Swift 4 中将 AnyObject 作为通用 T 参数传递

ios - 将阴影和角半径应用于 View ,而不是整个单元格

ios - 将 UIView 子类链接到 xib 文件

swift - 如何在 Swift 4 中增加 Index.String 类型的变量?