在Swift中如何使用Comparable协议?在声明中,它说我必须实现三个操作 <、<= 和 >=。我把所有这些都放在类里面,但还是行不通。另外,我需要同时拥有这三个操作吗?因为只要有其中一个,其他的就可以推断出来。
可比较协议扩展了可等价协议 -> 要实现它们两个。
在苹果参考文献中有一个来自苹果的例子(在Comparable协议参考中),你可以看到如何做:不要将操作实现放在类内部,而是放在外部/全局范围。另外,你只需要实现Comparable协议的<运算符和Equatable协议的==运算符。
正确的示例:
class Person : Comparable {
let name : String
init(name : String) {
self.name = name
}
}
func < (lhs: Person, rhs: Person) -> Bool {
return lhs.name < rhs.name
}
func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name
}
let paul = Person(name: "Paul")
let otherPaul = Person(name: "Paul")
let ben = Person(name: "Ben")
paul > otherPaul // false
paul <= ben // false
paul == otherPaul // true
以下是 Kametrixom 对于 Swift 3 的更新回答:
class Person : Comparable {
let name : String
init(name : String) {
self.name = name
}
static func < (lhs: Person, rhs: Person) -> Bool {
return lhs.name < rhs.name
}
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name
}
}
可以使用以下关系运算符比较Person
类的实例:
let paul = Person(name: "Paul")
let otherPaul = Person(name: "Paul")
let ben = Person(name: "Ben")
print(paul > otherPaul) // false
print(paul <= ben) // false
print(paul == otherPaul) // true
Comparable
协议,您需要先遵循Equatable
协议,通过实现static func == (lhs: Self, rhs: Self) -> Bool
,然后再实现Comparable
所需的唯一函数static func < (lhs: Self, rhs: Self) -> Bool
。class Person: Comparable {
let name: String
init(name: String) {
self.name = name
}
static func < (lhs: Person, rhs: Person) -> Bool {
return lhs.name < rhs.name
}
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name
}
}
或者甚至将协议遵循从类声明中分离出来,像这样:
class Person {
let name: String
init(name: String) {
self.name = name
}
}
extension Person: Comparable {
static func < (lhs: Person, rhs: Person) -> Bool {
return lhs.name < rhs.name
}
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name
}
}
这可能更接近于生产级别的代码。
func == (lhs: ClassA, rhs: ClassB) -> Bool
,以比较两个不同的类(测试显示只能按指定方向工作,所以你还必须创建func == (lhs: ClassB, rhs: ClassA) -> Bool
)。换句话说,Swift 编译器将(X == Y)
解释为==(X, Y)
而不是X.==(Y)
。 - Oliver==
。我只实现了<
,仍然能够测试相等性。这是因为聪明地重用了带有交换参数的<
吗? - Barry Jones