gpt4 book ai didi

ios - Swift 4 中带有默认大小写的 Codable 枚举

转载 作者:IT王子 更新时间:2023-10-29 05:16:17 26 4
gpt4 key购买 nike

我定义了一个 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 字符串属性。自动序列化和反序列化工作正常,但我发现如果遇到不同的字符串,反序列化失败。

是否可以定义一个映射任何其他可用案例的未知案例?

这可能非常有用,因为此数据来自 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 或更高版本

创建一个默认为 CaseIterable & Decodable 枚举的最后一个 case 的协议(protocol):

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!
}
}

Playground 测试:

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]

关于ios - Swift 4 中带有默认大小写的 Codable 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49695780/

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