我有一个名为MyContiguousStruct的Struct,它的内存布局没有填充。
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不是一个初始化的枚举。我知道我可以逐个字节地读入数据,即:
ivar1 = data[0]
ivar2 = data[1]
// ...但这意味着我不能把它放到一个可以附加到连续存储类型的协议中。如何确保枚举已初始化?
发布于 2017-04-19 01:15:10
我相信你将不得不手动解析它。枚举可以用原始值表示,但它们的底层类型不是该值(就像在某些语言中一样)。添加的功能是坚持RawRepresentable协议的结果,而不是通过更改类型或该类型的存储。
如果您不想手动解析数据,一种不错的解决方法是将ivar1设置为私有的,并为您的枚举提供计算属性。例如。
private let _ivar1: UInt8
var ivar1: EnumWithRawValueUInt8? {
return EnumWithRawValueUInt8(rawValue: _ivar1)
}https://stackoverflow.com/questions/43477842
复制相似问题