当咱们想要比较Swift中自定义类值是否相等的时候,咱们就须要实现Equatable协议git
协议就只有下面这一个方法github
static func == (lhs: Self, rhs: Self) -> Bool
swift
只须要比较各个属性值相等就能够了,可是我发现一个问题,咱们没有处理Optional的状况啊,函数的参数没有?
,貌似代码在Optional的状况下工做的也挺正常app
那么参数是Optional时到底发生了什么呢?函数
因而在网上搜索了一下,发现也有人有一样的疑惑,这位仁兄作了实验,发现Optional的状况和预期一致,因此不用管了。spa
It just works!3d
那就更疑惑了,没写代码怎么就能够用呢,好在swift是开源的,咱们能够一路找到swift是如何实现这样的功能的。code
而后就在Optional.swift的中看到了这样的代码,就是他替咱们处理了Optional的状况(咱们省略了大量的注释,建议你们看下注释内容,写得很是仔细)get
extension Optional : Equatable where Wrapped : Equatable {
@inlinable
public static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l == r
case (nil, nil):
return true
default:
return false
}
}
}
复制代码
也就是说,若是lhs和rhs,不是nil,那么就用咱们实现的方法;若是都是nil,那么就返回true;it
剩下的状况就都返回false。