【问题标题】:Enum with Raw value, Codable具有原始值的枚举,可编码
【发布时间】:2018-06-06 15:31:58
【问题描述】:

以下代码无法编译:

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

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

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

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

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

【问题讨论】:

  • 提示:如果您单击红色八边形(带有 '!'),Xcode 将显示与该诊断相关的任何注释,在这种情况下:“无法自动合成 'Decodable' 因为'Occupation' 不符合 'Decodable'”和“无法自动合成 'Encodable',因为 'Occupation' 不符合 'Encodable'”。
  • 谢谢,在这种情况下很明显,是职业造成了麻烦。

标签: ios swift enums swift-protocols codable


【解决方案1】:

自动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 可以在以后进行,但是 reverse 是一个突破性的变化。

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

  • 我们减少了编译器的工作量和代码量 通过不合成不想要的一致性而生成,并且 没用过。

【讨论】:

  • ????????
猜你喜欢
  • 1970-01-01
  • 2023-01-28
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多