【问题标题】:Trouble converting extension on Data to Swift 3.1 and UnsafeRawPointer无法将 Data 上的扩展转换为 Swift 3.1 和 UnsafeRawPointer
【发布时间】:2017-04-10 14:27:36
【问题描述】:

我正在将 swift 2.3 项目更新到 3.1,但在转换此功能时遇到了问题,特别是在一行上。

这是在 Data 的扩展中。

public func read<T: BinaryReadable>(offset f_offset: inout Int,
                                    byteOrder: ByteOrder = .HostByteOrder) -> T? {
    // Validate the specified offset boundary.
    guard self.count >= (f_offset + MemoryLayout<T>.size) else {
        return nil
    }

    //let dataPtr = Unsas
    // Get data pointer at offset location.

    // TROUBLE CONVERTING THIS LINE
    let dataPtr = UnsafePointer<UInt8>(bytes).advancedBy(f_offset)

    // Increment the offset position.
    f_offset += MemoryLayout<T>.size

    // Read data from offset location and return in specified endianess.
    let retVal = UnsafeRawPointer(dataPtr).load(as: T.self)
    return (byteOrder == .littleEndian) ? retVal.littleEndian : retVal.bigEndian
}

我好像听不懂

let dataPtr = UnsafePointer<UInt8>(bytes).advancedBy(f_offset)

转换为使用 UnsafeRawPointer。我尝试了太多,无法在此处列出(编译错误)。

正确的语法是什么?

【问题讨论】:

    标签: swift swift3 unsafe-pointers


    【解决方案1】:

    DatawithUnsafeBytes() 方法可以访问字节, 而UnsafeRawPointerload() 方法采用可选的字节偏移参数:

    let retVal = self.withUnsafeBytes {
        UnsafeRawPointer($0).load(fromByteOffset: f_offset, as: T.self)
    }
    

    但请注意,这假设(与您的原始代码一样) T 类型的内存地址正确对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      相关资源
      最近更新 更多