另一个选项是直接扩展
FixedWidthInteger
协议,这样任何
UnsignedInteger
都可以自动获得该函数。以下是在@Benson的答案基础上构建的示例:
extension FixedWidthInteger where Self: UnsignedInteger {
var bytes: [UInt8] {
var _endian = littleEndian
let bytePtr = withUnsafePointer(to: &_endian) {
$0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<Self>.size) {
UnsafeBufferPointer(start: $0, count: MemoryLayout<Self>.size)
}
}
return [UInt8](bytePtr)
}
}
我们可以通过单元测试来验证这一点:
func test_bytes() {
XCTAssertEqual(UInt8.min.bytes, [0])
XCTAssertEqual(UInt8.max.bytes, [255])
XCTAssertEqual(UInt16.min.bytes, [0, 0])
XCTAssertEqual(UInt16.max.bytes, [255, 255])
XCTAssertEqual(UInt32.min.bytes, [0, 0, 0, 0])
XCTAssertEqual(UInt32.max.bytes, [255, 255, 255, 255])
XCTAssertEqual(UInt64.min.bytes, [0, 0, 0, 0, 0, 0, 0, 0])
XCTAssertEqual(UInt64.max.bytes, [255, 255, 255, 255, 255, 255, 255, 255])
}