以下代码无法编译:

enum Occupation: String {
  case designer = "Designer"
  case engineer = "Engineer"
}

public struct SteveJobs: Codable {
  let name: String
  let occupation: Occupation
}

另一方面,由于Occupation表示为String,因此应该编译。

为什么我不能在Codable结构中使用带有原始值的enum

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

ios - 具有原始值的枚举,可编码-LMLPHP

最佳答案

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

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

自动HashableEquatable合成也是如此,
比较SE-0185中的Requesting synthesis is opt-in,其中
列出了一些原因:


  • 选择加入的语法很自然。没有明确的类似物
    今天,Swift取消了功能的类型。
  • 它要求用户对 public API做出有意识的决定
    根据它们的类型浮出水面。类型不能意外地“落入”
    用户不希望他们遵循的标准;一种不
    最初可以在以后支持Equatable,但是
    反向是一个重大变化。
  • 通过检查可以清楚地看到类型支持的一致性
    其源代码;用户看不到任何东西。
  • 我们减少了编译器完成的工作和代码量
    通过不合成不需要的一致性而生成的
    未使用。
  • 关于ios - 具有原始值的枚举,可编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50724245/

    10-11 22:40