我有一个enum:
public enum PersonType:String {
case Cool = "cool"
case Nice = "rude"
case SoLazy = "so-lazy"
public var description: String {
switch self {
case .Cool:
return "Cool person"
case .Nice:
return "Nice person"
case .SoLazy:
return "its so lazy person"
}
}
public var typeImage: String {
switch self {
case .Cool:
return "cool.png"
case .Nice:
return "img_nice.png"
case .Solazy:
return "lazy.png"
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题我不知道所有的人类型键,所以我需要处理类型为人的默认情况,并给它描述将是它的关键像"so-lazy"和默认图像.
假设我从Web服务获得此结果:
[
{
name: "john",
key: "cool"
},
{
name: …Run Code Online (Sandbox Code Playgroud) 我正在尝试Codable为一个对象采用协议,该对象必须从我的 Web 服务返回的 JSON 实例化以响应 API 调用之一。
其中一个属性是枚举类型,可选:nil表示没有选择 定义的任何选项enum。
该enum常数Int为基础的,并在开始1,不是 0:
class MyClass: Codable {
enum Company: Int {
case toyota = 1
case ford
case gm
}
var company: Company?
Run Code Online (Sandbox Code Playgroud)
这是因为0相应 JSON 条目上的值是为“未设置”保留的;即nil在设置初始化company属性时应该映射到它。
Swift 的 enum 初始值设定项init?(rawValue:)提供了开箱即用的此功能:Int与任何情况下的原始值都不匹配的参数将导致初始值设定项失败并返回 nil。此外,Int可以Codable通过在类型定义中声明它来使基于 (和 String) 的枚举符合:
enum Company: Int, Codable {
case toyota = …Run Code Online (Sandbox Code Playgroud) 我必须像这样反序列化一个 JSON 字符串:
{ "name" : "John Smith", "value" : "someValue" }
Run Code Online (Sandbox Code Playgroud)
在 Swift 4 中,“value”应该是一个枚举,整个对象是一个结构体,如下所示:
struct MyType {
name: String?
value: Value?
}
Run Code Online (Sandbox Code Playgroud)
在未来的某个时候,后端可能会添加新的枚举值,所以我认为进行一些回退是明智的。
我以为我可以创建一个枚举
enum Value {
case someValue
case someOtherValue
case unknown(value: String)
}
Run Code Online (Sandbox Code Playgroud)
但我无法解决如何反序列化该枚举并使其工作。以前我只是使用String枚举,但反序列化未知值会引发错误。
是否有一种简单的方法可以使其工作,或者我应该将值反序列化为 aString并在结构中创建一个自定义 getter 并使用 switch 语句返回其中一种情况(甚至可能不是在结构本身中,而是在我的视图模型中)?
对于给定的 JSON,如下所示:
{
"store": {
"animals": [
{
"type": "dog"
},
{
"type": "cat"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用 enum 解析它,type如下所示:
final class AnimalStore: Decodable {
let store: Store
}
extension AnimalStore {
struct Store: Decodable {
let animals: [Animal]
}
}
extension AnimalStore.Store {
struct Animal: Decodable {
let type: AnimalType?
}
}
extension AnimalStore.Store.Animal {
enum AnimalType: String, Decodable {
case dog = "dog"
case cat = "cat"
//case unknown = how such a case could …Run Code Online (Sandbox Code Playgroud)