使用扩展将数据转换为 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`
经过一些研究,我尝试将 withUnsafeMutableBytes
与 UnsafeMutablePointer<UInt32>
一起使用
但这给出了一个错误:Cannot use mutating member on immutable value: 'self' is immutable
。 (如果它不是不可变 getter 函数的一部分,这将起作用)
如何修复我的只读辅助变量,使编译器不发出警告?
(当然UInt8
或UInt16
也一样)
您可以将 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:)
。
我正在尝试使用 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`
经过一些研究,我尝试将 withUnsafeMutableBytes
与 UnsafeMutablePointer<UInt32>
但这给出了一个错误:Cannot use mutating member on immutable value: 'self' is immutable
。 (如果它不是不可变 getter 函数的一部分,这将起作用)
如何修复我的只读辅助变量,使编译器不发出警告?
(当然UInt8
或UInt16
也一样)
您可以将 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:)
。