以下代码无法编译:
enum Occupation: String {
case designer = "Designer"
case engineer = "Engineer"
}
public struct SteveJobs: Codable {
let name: String
let occupation: Occupation
}
另一方面,由于
Occupation
表示为String
,因此应该编译。为什么我不能在
Codable
结构中使用带有原始值的enum
?特别是为什么在这种情况下自动一致性不起作用。
最佳答案
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取消了功能的类型。
根据它们的类型浮出水面。类型不能意外地“落入”
用户不希望他们遵循的标准;一种不
最初可以在以后支持Equatable,但是
反向是一个重大变化。
其源代码;用户看不到任何东西。
通过不合成不需要的一致性而生成的
未使用。
关于ios - 具有原始值的枚举,可编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50724245/