符合Equatable vs定义func==



假设我想通过比较id来检查两个对象(顺便说一句:当对象是Struct而不是class时,谈论对象是正确的吗?我应该说"两个常量"吗?(是否相等。下面的示例显示,无论是否符合Equatable,这两个版本都有效。我还应该使用Equatable版本吗?

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let p1 = Person(id: 123, comment: "some comment")
let p2 = Person(id: 123, comment: "some other comment")
print(p1 == p2) //true
let op1 = OtherPerson(id: 456, comment: "just another comment")
let op2 = OtherPerson(id: 456, comment: "one more comment")
print(op1 == op2) //true
}
}
struct Person : Equatable {
var id: Int
var comment: String
static func == (lhs: Person, rhs: Person) -> Bool {
return (lhs.id == rhs.id)
}
}
struct OtherPerson { //no : Equatable
var id: Int
var comment: String
static func == (lhs: OtherPerson, rhs: OtherPerson) -> Bool {
return (lhs.id == rhs.id)
}
}

这不是必要的,但当您想将对象传递给使用Equatable的泛型函数时,它会有所帮助。

例如,我们可以使用自定义过滤器扩展Array

extension Array where Element: Equatable {
var unique: [Element] {
var res: [Element] = []
for item in self {
if !res.contains(item) {
res += [item]
}
}
return res
}
}

通过这种方式定义,Equatable中的任何Array都将自动获得unique函数。此外,Swift公共库定义了许多Array方法,这些方法仅适用于Equatable和/或Hashable对象。

我建议尽可能遵守所有可用的协议。在这一点上,遵守Equatable并不会让你付出任何代价,但它会给你带来很多好处。毕竟,他们称Swift为"面向协议的编程语言"。

您基本上是在问我们为什么有协议。我们不必谈论运算符,这对任何带有方法的协议都是有效的,例如:

protocol Closable {
func close()
}
struct A {
func close() {}
}
struct B: Closable {
func close() {}
}
let a = A()
a.close() // valid even without protocol
let b = B()
b.close() // valid with protocol

Equatable只是说某些类型定义了==运算符。得益于该协议,我们可以定义适用于符合该协议的所有类型的方法,例如:

func <T: Closable>doSomething(closable: T) {
...
closable.close()
}

如果没有协议,我们将不得不分别为每种类型(AB(定义这样的方法。协议提供了通用接口,允许我们约束其他类型的定义。CCD_ 14在这方面非常重要,因为它在标准库中被大量使用。

例如:

let personList1 = [OtherPerson(id: "123"), OtherPerson(id: "124")]
let personList2 = [OtherPerson(id: "123"), OtherPerson(id: "124")]
let listsAreEqual = (personList1 == personList2) // won't compile

为什么示例无法编译?因为只有当Element符合Equatable时,才定义阵列的==。仅仅存在==运算符是不够的。

另一个典型的用例是Array.contains。如果没有Equatable,这种方法是行不通的。

将类型声明为Equatable不会花费任何费用,但会立即为您带来许多好处。

最新更新