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 不安全指针的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 3 中的不透明指针创建类型化指针?

unity的C#学习——不安全代码(声明不安全代码块:实现C/C++指针的创建与相关操作)

如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?

智能指针线程安全问题

Metalkit:MTLBuffer和swift 3中的指针

Swift 中的指针使用