首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Swift 3中的数据初始化结构

从Swift 3中的数据初始化结构
EN

Stack Overflow用户
提问于 2017-04-19 00:44:51
回答 1查看 630关注 0票数 2

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

代码语言:javascript
复制
struct MyContiguousStruct {
    let ivar1: UInt8
    let ivar2: UInt8
    let ivar3: UInt16
    let ivar4: UInt16
}

我的初始化器是这样工作的(很棒):

代码语言:javascript
复制
init?(data: Data) {
    guard data.count == MemoryLayout<Self>.size else { return nil }
    self = data.withUnsafeBytes { $0.pointee }
}

我决定将ivar1的类型从UInt8更改为rawValueUInt8的枚举,如下所示:

代码语言:javascript
复制
struct MyContiguousStruct {
    let ivar1: EnumWithRawValueUInt8
    let ivar2: UInt8
    let ivar3: UInt16
    let ivar4: UInt16
}

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

代码语言:javascript
复制
ivar1 = data[0]
ivar2 = data[1]
// ...

但这意味着我不能把它放到一个可以附加到连续存储类型的协议中。如何确保枚举已初始化?

EN

回答 1

Stack Overflow用户

发布于 2017-04-19 01:15:10

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

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

代码语言:javascript
复制
private let _ivar1: UInt8
var ivar1: EnumWithRawValueUInt8? {
    return EnumWithRawValueUInt8(rawValue: _ivar1)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43477842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档