ios - 具有原始值的枚举,可编码
问题描述
以下代码无法编译:
enum Occupation: String {
case designer = "Designer"
case engineer = "Engineer"
}
public struct SteveJobs: Codable {
let name: String
let occupation: Occupation
}
另一方面,它应该编译,因为Occupation
表示为 a String
which is Codable
。
为什么我不能enum
在结构中使用原始值Codable
?
特别是,为什么自动一致性在这种情况下不起作用。
解决方案
自动Codable
综合是“选择加入”的,即您必须明确声明一致性:
enum Occupation: String, Codable { // <--- HERE
case designer = "Designer"
case engineer = "Engineer"
}
public struct SteveJobs: Codable {
let name: String
let occupation: Occupation
}
通过采用这些协议,用户类型可以选择加入该系统。
Hashable
自动和合成也是如此Equatable
,比较请求合成在 SE-0185 中是可选的,其中列出了一些原因:
选择加入的语法很自然;今天在 Swift 中没有明确的类比来让类型选择退出功能。
它要求用户对其类型所显示的公共 API 做出有意识的决定。类型不会意外地“落入”用户不希望的一致性;最初不支持 Equatable 的类型可以在以后进行,但反过来是一个重大更改。
通过检查其源代码可以清楚地看到类型支持的一致性;没有任何东西对用户隐藏。
我们减少了编译器完成的工作以及通过不综合不需要且未使用的一致性而生成的代码量。
推荐阅读
- java - 错误 - ''在类 Node 中找不到主方法,请将主方法定义为...." 在以下代码中:
- tfx - 将旧版 ML 管道迁移到 TFX
- groovy - Gremlin 查询返回图遍历而不是边
- android - 我们可以从其他 buildType 继承 AndroidManifest 吗?
- arrays - C - 避免警告“与返回的局部变量相关的堆栈内存地址”
- javascript - 使用 html/javascript 发送 redis 消息
- c++ - 我将如何使用在头文件中预定义的朋友方法?
- html - 在移动设备上并排放置两个横幅图像
- mongodb - Mongoose中唯一的父子关系数据
- javascript - 如何创建 pugjs 组件?