swift - Swift 在协议上具有可比性
问题描述
祝大家新年快乐
protocol Birthday {
var date: Date { get set }
}
class Person: Birthday {
var date: Date
var fullName: String
// ...
}
class Car: Birthday {
var date: Date
var color: UIColor
// ...
}
我希望这符合Comparable
,所以我可以做到
Person() > Car()
代替
Person().date > Car().date
我怎样才能做到这一点?太感谢了
解决方案
你可以做的>
微不足道。只需编写以下顶级函数:
func > (lhs: Birthday, rhs: Birthday) -> Bool { lhs.date > rhs.date }
但是您不能将生日与可比较。Comparable 要求类型实现以下内容:
static func < (lhs: Self, rhs: Self) -> Bool
Self
是符合协议的类型。协议不符合自己。它们不是“类型”。它们描述类型。(在某些情况下,可能会生成一个隐式存在类型,但在 Swift 中无法操作存在类型。)为了具有可比性,一个类型必须能够将自己与另一个相同类型的事物进行比较,而您无法通过协议。
但是您可以使用您的协议创建任何特定的语法。您只需要编写函数。
虽然这里有一个技术限制(协议不符合自己),即使 Swift 语法可以支持符合自己的协议(并且将来会有一些方法),你仍然不应该以这种方式实现 Comparable。Comparable 需要 Equatable。一个人永远不能等同于一辆汽车。那是因为 Equatable 需要的不仅仅是一个==
函数。它需要可替代性。如果两件事在 Equatable 意义上是“平等的”,那么系统总是可以用一个代替另一个,而你永远不会关心它给了你哪一个。对于人和汽车来说,情况并非如此。
为避免此类问题,不建议<
在此处使用。这意味着这些东西只有一个合理的顺序,而“生日”并不是这些东西的唯一顺序。因此,如果您想比较日期,我绝对建议您明确并比较日期。
推荐阅读
- python - 根据其他两列的条件创建列
- node.js - 如何仅向特定用户发出推送事件?
- java - 如何在android运行时将数千个数据存储在Sqlite中?
- swift - TextEditor 键盘避免
- reactjs - 反应脚本无法识别?
- node.js - GAE:禁用已处理错误的错误报告
- javascript - 数据表数据未使用新的服务器数据更新
- in-app-purchase - 当用户在不使用应用内购买的情况下上传一定数量的创意产品图片时,是否有可能以某种方式收费
- python-3.x - RE:OpenCV、Python3 模块可以将 SPI 设备作为相机处理吗?
- kotlin - Kotlin:不兼容的类型:String 和 Int