从Swift 3中的Data初始化struct

时间:2017-04-18 16:44:51

标签: swift struct enums initialization memory-layout

我有一个名为Struct的{​​{1}},其内存布局没有填充。

MyContiguousStruct

我的初始化程序很棒(很棒):

struct MyContiguousStruct {
    let ivar1: UInt8
    let ivar2: UInt8
    let ivar3: UInt16
    let ivar4: UInt16
}

我决定将init?(data: Data) { guard data.count == MemoryLayout<Self>.size else { return nil } self = data.withUnsafeBytes { $0.pointee } } 的类型从ivar1更改为UInt8 rawValue的枚举,如下所示:

UInt8

但现在我看到的是初始化的struct MyContiguousStruct { let ivar1: EnumWithRawValueUInt8 let ivar2: UInt8 let ivar3: UInt16 let ivar4: UInt16 } ,但MyContiguousStruct不是初始化的枚举。我知道我可以逐字节读取数据,即:

ivar1

但这意味着我无法将其投入到我可以附加到连续存储类型的协议中。如何确保枚举初始化?

1 个答案:

答案 0 :(得分:1)

我相信你必须手动解析它。枚举可以用原始值表示,但它们的底层类型不是那个值(因为它们在某些语言中)。增加的功能是遵守RawRepresentable协议的结果,而不是通过更改该类型的类型或存储。

如果您不想手动解析数据,那么一个体面的工作就是使ivar1为私有,并为您的枚举设置计算属性。 E.g。

private let _ivar1: UInt8
var ivar1: EnumWithRawValueUInt8? {
    return EnumWithRawValueUInt8(rawValue: _ivar1)
}