如何在Swift中使用Comparable协议?在声明中它说我必须实现三个操作<,< =和> =。我把所有这些都放在课堂上,但它不起作用。我还需要拥有这三个吗?因为应该可以从一个推断出所有这些。
答案 0 :(得分:57)
Comparable协议扩展了Equatable协议 - >实施两者
在Apple's Reference中是Apple的一个示例(在可比协议参考中),您可以看到如何执行此操作:不要将操作实现放在类中,而是放在外部/全局范围。此外,您只需要从<
协议实施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
答案 1 :(得分:3)
为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
}
}
//然后从其他地方打电话
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
答案 2 :(得分:0)
要实现Swift的Comparable
协议,您需要首先通过实现Equatable
来遵循static func == (lhs: Self, rhs: Self) -> Bool
协议,然后为{{1}实现唯一所需的功能static func < (lhs: Self, rhs: Self) -> Bool
}。
代替声明全局运算符重载,您应该在struct / class本身中实现符合协议的方法。尽管全局运算符重载满足协议一致性,但是以这种方式声明它们而不是在struct / class上使用预期的静态方法是一种不好的做法。
如果查看文档示例,您将看到与示例代码相同的内容。
我改写以下内容:
Comparable
甚至从类声明中分离出协议一致性,如下所示:
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
}
}
这可能更接近生产级代码。