首页 > 解决方案 > 具有原始值的枚举,可编码

问题描述

以下代码无法编译:

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

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

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

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

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

错误

标签: iosswiftenumsswift-protocolscodable

解决方案


自动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 归档和序列化

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

Hashable自动和合成也是如此Equatable,比较请求合成在 SE-0185 中是可选的,其中列出了一些原因:

  • 选择加入的语法很自然;今天在 Swift 中没有明确的类比来让类型选择退出功能。

  • 它要求用户对其类型所显示的公共 API 做出有意识的决定。类型不会意外地“落入”用户不希望的一致性;最初不支持 Equatable 的类型可以在以后进行,但反过来是一个重大更改。

  • 通过检查其源代码可以清楚地看到类型支持的一致性;没有任何东西对用户隐藏。

  • 我们减少了编译器完成的工作以及通过不综合不需要且未使用的一致性而生成的代码量。


推荐阅读