无法将Data上的扩展转换为Swift 3.1和UnsafeRawPointer

时间:2017-04-10 14:27:36

标签: swift swift3 unsafe-pointers

我正在将swift 2.3项目更新为3.1,我遇到了转换此函数的问题,特别是在一行上。

这是对数据的扩展。

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。我已经尝试过太多但没有成功(编译错误)。

什么是正确的语法?

1 个答案:

答案 0 :(得分:1)

withUnsafeBytes()的{​​{1}}方法可以访问字节, Data load()方法采用可选的字节偏移量参数:

UnsafeRawPointer

但请注意,这假设(与原始代码一样) 内存地址已正确对齐let retVal = self.withUnsafeBytes { UnsafeRawPointer($0).load(fromByteOffset: f_offset, as: T.self) } 类型。