isEqual 是NSObject提供的一个方法
func isEqual(_ object: Any?) -> Bool
, NSObject 默认实现了该方法,直接根据两个对象的指针是否相等,是则返回true.-
== 是Equatable协议定义的方法
public static func ==(lhs: Self, rhs: Self) -> Bool
,NSObject也默认实现了Equatable协议,并且默认是调用isEqual来比较的,调用堆栈如下:
因此在自定义两个对象的相等比较时,
- 如果该对象继承自NSObject, 则应该重写isEqual方法,这样能保证无论用 a.isEqual(b) 还是 a == b, 都能正确的调用isEqual里的逻辑;
- 如果该对象是非继承自NSObject,则应该让其实现Equatable协议,并实现 == 方法。