使用扩展将数据转换为 UInt32

Convert Data to UInt32 using extension

我正在尝试使用 Data class 的辅助方法将字节转换为 UInt32。到目前为止这有效:

extension Data {    
    var uint32:UInt32 {
        return UInt32(littleEndian: self.withUnsafeBytes { (ptr: UnsafePointer<UInt32>) in ptr.pointee })
    }
}

从 swift 5 开始,编译器给出以下警告:

'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R` instead`

经过一些研究,我尝试将 withUnsafeMutableBytesUnsafeMutablePointer<UInt32>

一起使用

但这给出了一个错误:Cannot use mutating member on immutable value: 'self' is immutable。 (如果它不是不可变 getter 函数的一部分,这将起作用)

如何修复我的只读辅助变量,使编译器不发出警告?

(当然UInt8UInt16也一样)

您可以将 self 分配给 variable

extension Data {
    var uint32:UInt32 {
        var data = self
        return UInt32(littleEndian: data.withUnsafeMutableBytes { (ptr: UnsafeMutablePointer<UInt32>) in ptr.pointee })
    }
}

试试这个:

let data = Data([0x01,0x02,0x03,0x04])
extension Data {
    var uint32:UInt32 {
        return UInt32(littleEndian: self.withUnsafeBytes { bytes in
            bytes.load(as: UInt32.self)
        })
    }
}
print(String(format: "%08X", data.uint32)) //->04030201

新的withUnsafeBytes传递了一个UnsafeRawBufferPointer,它有一个有用的方法load(as:)