【问题标题】:Swift 3 Unsafe PointerSwift 3 不安全指针
【发布时间】: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 docuentationUnsafePointer&lt;&gt; 已被UnsafeRawPointer 取代。所以我改变了我的代码如下

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

但是在第二行它说

类型“UnsafeRawPointer”没有下标成员

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

【问题讨论】:

标签: ios swift2 swift3


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2018-07-29
      • 2014-08-30
      • 2013-08-12
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多