swift - 尝试从手册编译 Swift 代码时出现错误:“类型不符合协议‘Comparable’”
问题描述
我从Swift - Protocols 手册页尝试了以下示例,但出现编译器错误:
error: type 'SkillLevel' does not conform to protocol 'Comparable'
:
enum SkillLevel: Comparable {
case beginner
case intermediate
case expert(stars: Int)
}
var levels = [SkillLevel.intermediate, SkillLevel.beginner,
SkillLevel.expert(stars: 5), SkillLevel.expert(stars: 3)]
for level in levels.sorted() {
print(level)
}
Xcode 建议添加以下函数以使其符合 Comparable:
static func < (lhs: SkillLevel, rhs: SkillLevel) -> Bool {
<#code#>
}
从手册:
Swift 为没有原始值的枚举提供了 Comparable 的综合实现。如果枚举具有关联类型,则它们必须都符合 Comparable 协议。要接收 < 的综合实现,请在包含原始枚举声明的文件中声明与 Comparable 的一致性,而无需自己实现 < 运算符。Comparable 协议的默认实现 <=、> 和 >= 提供了剩余的比较运算符。
我不确定上面代码中的枚举是否有原始值,但如果没有,代码不应该在没有实现函数“<”的情况下编译吗?
解决方案
如果您有类似于普通 C 枚举的内容,则自动生成 < 运算符会起作用;只是案例,没有别的。但是这里其中一种情况具有关联的类型,因此编译器不想猜测您希望值如何排序。
推荐阅读
- design-patterns - 这是“合法”的微服务设计吗?
- emacs - 当 emacs 加载 hello.tex 时,latex-preview-pane-update 找不到“pdflatex”目录
- file-upload - 使用 Angular HTTP 上传 Ionic 4 图像
- jakarta-ee - 显示应用程序的版本
- android - 如何正确修改或删除领域中的对象?
- python - 如何根据列中字符串的长度有条件地从 PySpark Dataframe StringType() 列中删除字符的子字符串?
- java - 需要转换列表
到一个元素 - java - 如何在xml中搜索元素?
- python - 如何在python中抓取多个元数据?
- javascript - 在 Bootstrap 中,为什么我的禁用按钮没有工具提示?