我有这个定义:
struct DataPacket {
struct Header {
enum PackageType: UInt8 {
case some2 = 0x02
case intermediate = 0x03
case error = 0x04
case some5 = 0x05
}
let firstByte: UInt8
let secondByte: UInt8
let status: PackageType
}
let header: Header
}
为什么这样:
let data = Data(bytes: [0xff, 0xfe, 0x03, 0x56, 0x53]) as NSData
let packet = data.bytes.load(as: DataPacket.self)
print(packet.header.firstByte)
print(packet.header.secondByte)
print(packet.header.status)
打印这个:
255
254
some5
而不是:
255
254
intermediate
也许它只是我身边的一个脑筋......?
答案 0 :(得分:1)
Swift枚举确实存储为偏移量,值0x03始终表示“第四种情况”而不是“rawValue == 0x03”的情况。
https://academy.realm.io/posts/goto-mike-ash-exploring-swift-memory-layout/有一节关于此:
这里发生的是原始值可以存储在某个单独的表中,编译器知道它,没有任何类型的每个实例原始值,所以它可以只是零,一,二,三,四。在其他地方有一个表,表示零是“无论什么”,一个是B,两个是C,等等。