Equatable
对于Swift中大多标准库定义的类型,都是遵循了 协议的
如String、Int、Dictionary、Array、Set等
但是对于自定义的类型,如struct, class等,默认是没有实现Equatable;
public protocol Equatable {
/// Returns a Boolean value indicating whether two values are equal.
///
/// Equality is the inverse of inequality. For any values `a` and `b`,
/// `a == b` implies that `a != b` is `false`.
///
/// - Parameters:
/// - lhs: A value to compare.
/// - rhs: Another value to compare.
static func == (lhs: Self, rhs: Self) -> Bool
}
extension Equatable {
public static func != (lhs: Self, rhs: Self) -> Bool
}
通过源码可以发现,Equatable协议,实际上就是定义了一个静态"=="的方法。
不遵循Equatable协议,怎么使用==比较两个自定义类型的对象?
如果是我们自定义的类型,如struct Person{},不想遵循这个Equatable协议,那么自己就要在自定义的类型中,去声明并实现static func == (lhs: Self, rhs: Self) -> Bool这个方法
自定义的class、struct都是这样
既然自定义的类型可以自己实现==这个方法,为什么还要Equatable协议?
swift的值类型,如struct、enum,实际上,一旦遵循了Equatable协议,都会提供默认==实现,底层实现规则,则是比较struct内部各成员变量的值是否相等。当然也可以自己重写这个方法。