2016-11-16 132 views
3

我正在从Swift 2迁移到Swift 3,并且我被困在一个点上。Swift 3 Unsafe指针

斯威夫特2

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

我得到第一线的错误说

是 'init' 是不可用:使用 'withMemoryRebound(到:容量:__)' 来 临时查看内存作为另一种布局兼容类型。

我试图使用withMemoryoRebound方法,但我不确定参数。 按照this docuentation,UnsafePointer<>已被UnsafeRawPointer取代。所以我改变了我的代码如下

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

但这里的第二行,它说

类型“UnsafeRawPointer”无标会员

我怎样才能成功地将其转换为斯威夫特3?

+1

这可能是你在找什么:?如何获得字节出UnsafeMutableRawPointer的(http://stackoverflow.com/questions/38983277/how-to-get-bytes-out-of -an-unsafemutablerawpointer) –

回答

0

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

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

这是如何使用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 
}