我有一个名为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
但这意味着我无法将其投入到我可以附加到连续存储类型的协议中。如何确保枚举初始化?
答案 0 :(得分:1)
我相信你必须手动解析它。枚举可以用原始值表示,但它们的底层类型不是那个值(因为它们在某些语言中)。增加的功能是遵守RawRepresentable协议的结果,而不是通过更改该类型的类型或存储。
如果您不想手动解析数据,那么一个体面的工作就是使ivar1
为私有,并为您的枚举设置计算属性。
E.g。
private let _ivar1: UInt8
var ivar1: EnumWithRawValueUInt8? {
return EnumWithRawValueUInt8(rawValue: _ivar1)
}