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<>
已被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 不安全指针的主要内容,如果未能解决你的问题,请参考以下文章
unity的C#学习——不安全代码(声明不安全代码块:实现C/C++指针的创建与相关操作)
如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?