Swift-爲何實現Equatable不須要處理Optional

引言

當咱們想要比較Swift中自定義類值是否相等的時候,咱們就須要實現Equatable協議git

協議就只有下面這一個方法github

static func == (lhs: Self, rhs: Self) -> Boolswift

只須要比較各個屬性值相等就能夠了,可是我發現一個問題,咱們沒有處理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。

參考資料

Optional.swift

swift-equatable-with-optionals

相關文章
相關標籤/搜索