首页 > 解决方案 > 使用扩展将数据转换为 UInt32

问题描述

我正在尝试为Data类提供一个帮助方法来将字节转换为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 函数的一部分,这将起作用)

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

(当然同样适用于UInt8or UInt16

标签: swiftswift5

解决方案


尝试这个:

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

newwithUnsafeBytes传了一个UnsafeRawBufferPointer,里面有一个有用的方法load(as:)


推荐阅读