NSData to Type转换为错误的枚举

时间:2018-04-09 16:59:29

标签: swift

我有这个定义:

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

也许它只是我身边的一个脑筋......?

1 个答案:

答案 0 :(得分:1)

Swift枚举确实存储为偏移量,值0x03始终表示“第四种情况”而不是“rawValue == 0x03”的情况。

https://academy.realm.io/posts/goto-mike-ash-exploring-swift-memory-layout/有一节关于此:

  

这里发生的是原始值可以存储在某个单独的表中,编译器知道它,没有任何类型的每个实例原始值,所以它可以只是零,一,二,三,四。在其他地方有一个表,表示零是“无论什么”,一个是B,两个是C,等等。