當咱們想要比較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。