以下代码无法编译:
enum Occupation: String {
case designer = "Designer"
case engineer = "Engineer"
}
public struct SteveJobs: Codable {
let name: String
let occupation: Occupation
}
另一方面,它应该编译,因为Occupation
表示为String
Codable
。
为什么我不能在enum
结构中使用Codable
原始值?
特别是,为什么在这种情况下自动一致性不起作用。
答案 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
通过采用这些协议,用户类型可以选择加入此系统。
自动Hashable
和Equatable
合成也是如此,
比较SE-0185中的Requesting synthesis is opt-in,其中
列出了一些原因:
选择的语法很自然;没有明确的类比 Swift今天有一个类型选择退出功能。
它要求用户有意识地决定公共API 由他们的类型浮出水面。类型不能意外“陷入” 用户不希望他们遵守的一致性;一种没有的类型 最初支持Equatable可以在以后制作,但是 反向是一个突破性的变化。
通过检查可以清楚地看到类型支持的一致性 它的源代码;用户无法隐藏任何内容。
我们减少了编译器的工作量和代码量 通过不合成不期望的一致性而产生的 没用过。