Swift 3 不安全指针

Posted

技术标签:

【中文标题】Swift 3 不安全指针【英文标题】:Swift 3 Unsafe Pointer 【发布时间】:2016-11-16 16:48:19 【问题描述】:

我正在从 Swift 2 迁移到 Swift 3,但我被困在了某个时刻。

斯威夫特 2

let arr = UnsafePointer<UInt32>(UnsafePointer<UInt8>(buf).advanced(by: off))
let msk = arr[0].bigEndian & 0x7fffffff

我在第一行出现错误提示

'init' 不可用:使用 'withMemoryRebound(to:capacity:_)' 暂时将内存视为另一种布局兼容的类型。

我尝试使用withMemoryoRebound 方法,但我不确定参数。 根据this docuentation,UnsafePointer&lt;&gt; 已被UnsafeRawPointer 取代。所以我改变了我的代码如下

let arr = UnsafeRawPointer(UnsafePointer<UInt8>(buf).advanced(by: off))
let msk = arr[0].bigEndian & 0x7fffffff

但是在第二行它说

类型“UnsafeRawPointer”没有下标成员

我怎样才能成功地将其转换为 Swift 3?

【问题讨论】:

这可能就是你要找的东西:How to get bytes out of an UnsafeMutableRawPointer? 【参考方案1】:

这是使用 withMemoryRebound 执行该操作的方法: 在这种情况下,容量为 1,因为您只查看结果数组的第一个元素。

let arr = UnsafePointer<UInt8>(buf).advanced(by: off)
let msk = arr.withMemoryRebound(to: UInt32.self, capacity: 1)  p in
    return p[0].bigEndian & 0x7fffffff

【讨论】:

【参考方案2】:

我认为您正在寻找这样的东西:

let ppp = UnsafePointer<UInt8>(buf).advanced(by: off)
let arr = unsafeBitCast(ppp, to: UnsafeMutablePointer<UInt32>.self)

【讨论】:

以上是关于Swift 3 不安全指针的主要内容,如果未能解决你的问题,请参考以下文章