具有原始价值的枚举,可编码

时间:2018-06-06 15:31:58

标签: ios swift enums swift-protocols codable

以下代码无法编译:

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

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

另一方面,它应该编译,因为Occupation表示为String Codable

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

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

error

1 个答案:

答案 0 :(得分:4)

自动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今天有一个类型选择退出功能。

  •   
  • 它要求用户有意识地决定公共API   由他们的类型浮出水面。类型不能意外“陷入”   用户不希望他们遵守的一致性;一种没有的类型   最初支持Equatable可以在以后制作,但是   反向是一个突破性的变化。

  •   
  • 通过检查可以清楚地看到类型支持的一致性   它的源代码;用户无法隐藏任何内容。

  •   
  • 我们减少了编译器的工作量和代码量   通过不合成不期望的一致性而产生的   没用过。

  •