EasyCodable

Swift Codable 中轻松处理易失败的可选枚举属性。

安装

您可以通过将 EasyCodable 添加为包依赖项来将其添加到 Xcode 项目中。

  1. 文件菜单中,选择Add Packages…
  2. 在包仓库 URL 文本字段中输入 https://github.com/sochalewski/EasyCodable
  3. 将包添加到您的应用程序目标。

为什么?

考虑以下数据模型

struct Car: Codable {
    enum Manufacturer: String, Codable {
        case toyota, volkswagen, ford, honda, generalMotors
    }
    
    var manufacturer: Manufacturer?
    var vin: String?
    var owner: String?
}

如果接收到的 JSON 与可用的 Manufacturer 枚举值匹配,一切都完美运行,例如这样

{
    "manufacturer": "toyota",
    "vin": "JT4RN67S0G0002845",
    "owner": null
}

但是 Car.manufacturer 是可选的,因此即使接收到的制造商与当前支持的制造商不匹配,拥有有效的模型也是有意义的

{
    "manufacturer": "tesla",
    "vin": "5YJSA2DP8DFP22249",
    "owner": "Elon Musk"
}

不幸的是,使用 JSONDecoder 解码会导致整个 Car 得到 nil,而不仅仅是 Car.manufacturer

这可以通过自定义 Decodable 协议的 init(from:) 来解决,但这需要大量的样板代码,尤其是在您的模型中有数十个枚举时。

这就是 EasyCodable 的用武之地!

用法

只需将 @EasyNil 属性包装器添加到您的可选 RawRepresentable 属性即可。

struct Car: Codable, Equatable {
    enum Manufacturer: String, Codable {
        case toyota, volkswagen, ford, honda, generalMotors
    }
    
    @EasyNil var manufacturer: Manufacturer?
    var vin: String?
    var owner: String?
}

作者

Piotr Sochalewski, sochalewski.github.io