代码之家  ›  专栏  ›  技术社区  ›  Richard Topchii

原始值可编码的枚举

  •  1
  • Richard Topchii  · 技术社区  · 7 年前

    以下代码无法编译:

    enum Occupation: String {
      case designer = "Designer"
      case engineer = "Engineer"
    }
    
    public struct SteveJobs: Codable {
      let name: String
      let occupation: Occupation
    }
    

    另一方面,它应该编译自 Occupation 表示为 String 哪个是 Codable .

    为什么我不能用 enum 原始价值 可编的 结构?

    特别是,为什么自动一致性在这种情况下不起作用。

    error

    1 回复  |  直到 7 年前
        1
  •  4
  •   Martin R    7 年前

    自动的 Codable 合成是选择性加入,即您必须声明 明确一致性:

    enum Occupation: String, Codable { // <--- HERE
        case designer = "Designer"
        case engineer = "Engineer"
    }
    
    public struct SteveJobs: Codable {
        let name: String
        let occupation: Occupation
    }
    

    SE-0166 Swift Archival & Serialization

    通过采用这些协议,用户类型选择加入这个系统。

    对于automatic也是如此 Hashable Equatable 合成, 比较 Requesting synthesis is opt-in 在SE-0185中,其中 原因如下:

    • 选择in的语法是自然的;在 今天斯威夫特有一个类型选择退出一个功能。

    • 它要求用户有意识地决定公共api 以他们的类型浮出水面。类型不能意外地“落入” 用户不希望的一致性;不希望的类型 最初的支持可在稍后日期设置为,但是 逆转是一个突破性的变化。

    • 通过检查,可以清楚地看到类型所支持的一致性 它的源代码;用户不会隐藏任何东西。

    • 我们减少了编译器所做的工作和代码量 不合成不需要的一致性而产生 不使用。