【发布时间】:2018-05-17 23:26:23
【问题描述】:
我必须像这样反序列化一个 JSON 字符串:
{ "name" : "John Smith", "value" : "someValue" }
在 Swift 4 中,“值”应该是一个枚举,而整个对象是一个结构体,例如:
struct MyType {
name: String?
value: Value?
}
在未来的某个时候,后端可能会添加新的枚举值,所以我认为有一些后备是明智的。
我想我可以创建一个类似的枚举
enum Value {
case someValue
case someOtherValue
case unknown(value: String)
}
但我只是不知道如何反序列化该枚举并使其工作。以前我只是简单地使用了String 枚举,但是反序列化未知值会引发错误。
是否有一种简单的方法可以使该工作正常工作,或者我应该将值反序列化为String 并使用 switch 语句在结构中创建自定义 getter 以返回其中一种情况(甚至可能不在结构本身中,而是在我的视图模型中)?
【问题讨论】:
-
您可以轻松地为任一类型编写自定义的
init(coder:)。但是,如果新的枚举值被添加到您自己的后端而不让客户团队知道,这不是技术上解决的问题...... -
这不是通知,而是向后兼容。可能有些用户只是懒得更新,但我仍然想向他们展示带有新枚举值的条目。我将枚举用于多种用途,例如为某物选择正确的颜色或显示某个图标。然后默认值至少可以显示默认颜色和图标。这应该比简单地不显示任何东西要好。我的主要问题是我反序列化了整个结构数组,因此一个错误的枚举导致没有条目出现
-
添加一些你想怎么做的代码。
标签: json swift enums deserialization codable