gpt4 book ai didi

Swift 在协议(protocol)上的可比性

转载 作者:行者123 更新时间:2023-12-04 08:20:27 26 4
gpt4 key购买 nike

大家新年快乐

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 }

但是您不能使 Birthday 符合 Comparable。 Comparable 要求类型实现以下内容:

static func < (lhs: Self, rhs: Self) -> Bool

Self是符合协议(protocol)的类型。协议(protocol)不符合自身。它们不是“类型”。他们描述类型。 (在某些情况下,可能会生成隐式存在类型,但无法在 Swift 中操作存在类型。)为了具有可比性,一个类型必须能够将自己与另一个相同类型的事物进行比较,你无法通过协议(protocol)获得它。

但是您可以创建任何您希望在您的协议(protocol)中使用的特定语法。您只需要编写函数。

虽然这里有一个技术限制(协议(protocol)不符合自身),即使 Swift 语法可以支持符合自身的协议(protocol)(并且将来有办法),你仍然不应该以这种方式实现 Comparable . Comparable 需要 Equatable。一个人永远不能等同于一辆汽车。那是因为 Equatable 需要的不仅仅是 ==。功能。它需要可替代性。如果两件事在 Equatable 意义上是“相等的”,那么系统可以总是用一个代替另一个,您永远不会关心它给您的是哪一个。对于人和汽车而言,情况并非如此。

为避免此类问题,不建议使用 <这里。这意味着这些东西只有一种合理的顺序,而“生日”并不是这些东西的唯一顺序。因此,如果您想比较日期,我肯定会建议直接明确并比较日期。

关于Swift 在协议(protocol)上的可比性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65524619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com