gpt4 book ai didi

swift - 在 Swift 3 中从数据初始化结构

转载 作者:可可西里 更新时间:2023-11-01 02:05:09 26 4
gpt4 key购买 nike

我有一个名为 MyContiguousStructStruct,其内存布局没有填充。

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 更改为 rawValueUInt8 的枚举像这样:

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

但现在我得到的似乎是已初始化的 MyContiguousStruct,但 ivar1 不是已初始化的枚举。我知道我可以逐字节读取数据,即:

ivar1 = data[0]
ivar2 = data[1]
// ...

但这意味着我不能将其放入可以附加到连续存储类型的协议(protocol)中。如何确保枚举已初始化?

最佳答案

我相信您将不得不手动解析它。枚举可以由原始值表示,但它们的底层类型不是该值(在某些语言中是这样)。添加的功能是遵守 RawRepresentable 的结果协议(protocol),而不是通过更改类型或该类型的存储。

如果您不想手动解析数据,一个不错的解决方法是将 ivar1 设为私有(private),并为您的枚举设置一个计算属性。例如

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

关于swift - 在 Swift 3 中从数据初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com