我对enum的定义如下:

enum Type: String, Codable {
    case text = "text"
    case image = "image"
    case document = "document"
    case profile = "profile"
    case sign = "sign"
    case inputDate = "input_date"
    case inputText = "input_text"
    case inputNumber = "input_number"
    case inputOption = "input_option"

    case unknown
}

映射JSON字符串属性.

是否可以定义一个unknown个 case 来映射任何其他可用的 case ?

这可能非常有用,因为这些数据来自RESTFul API,将来可能会发生变化.

推荐答案

如果出现故障,您可以扩展Codable类型并指定默认值:

enum Type: String {
    case text,
         image,
         document,
         profile,
         sign,
         inputDate = "input_date",
         inputText = "input_text" ,
         inputNumber = "input_number",
         inputOption = "input_option",
         unknown
}
extension Type: Codable {
    public init(from decoder: Decoder) throws {
        self = try Type(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? .unknown
    }
}

编辑/更新:

Xcode 11.2 • Swift 5.1 or later

创建默认为CaseIterable & Decodable枚举的最后一种情况的协议:

protocol CaseIterableDefaultsLast: Decodable & CaseIterable & RawRepresentable
where RawValue: Decodable, AllCases: BidirectionalCollection { }

extension CaseIterableDefaultsLast {
    init(from decoder: Decoder) throws {
        self = try Self(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? Self.allCases.last!
    }
}

操场测试:

enum Type: String, CaseIterableDefaultsLast {
    case text, image, document, profile, sign, inputDate = "input_date", inputText = "input_text" , inputNumber = "input_number", inputOption = "input_option", unknown
}

let types = try! JSONDecoder().decode([Type].self , from: Data(#"["text","image","sound"]"#.utf8))  // [text, image, unknown]

Swift相关问答推荐

如何在SwiftUI中创建具有圆角顶部和锯齿状底部边缘的自定义Shape,类似于撕破的纸?

如何使用快速宏用来自函数的关联值来初始化枚举?

UITableView未显示类数组数据

map 视图上的SwiftUI渐变折线

SwiftUI:使视图B与视图A具有相同宽度的视图A更改比率?

我需要一些关于 SwiftUI 动画的帮助

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

在 SwiftUI 中禁用 Select 器选项

无法使用 RealityKit 播放 USDZ 动画

MacOS KIND 是如何实现的

UUID 哈希值是不确定的吗?

Swift 非参与者隔离闭包

swift : 具有类型和值的枚举常量

如何快速截取 UIView 的屏幕截图?

try 在解除分配时加载视图控制器的视图... UIAlertController

自动布局:获取 UIImageView 高度以正确计算单元格高度

如何在 SwiftUI 中以编程方式滚动列表?

Swift 5 秒后关闭 UIAlertView

在情节提要中设置的 UITableViewCell 的恢复 ID 和标识符有什么区别

在这个例子中美元符号有什么作用?