Swift-為什麼實現Equatable不需要處理Optional

weixin_33890499發表於2018-12-28

引言

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

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

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

只需要比較各個屬性值相等就可以了,但是我發現一個問題,我們沒有處理Optional的情況啊,函式的引數沒有,貌似程式碼在Optional的情況下工作的也挺正常

那麼引數是Optional時到底發生了什麼呢?

探索

於是在網上搜尋了一下,發現也有人有同樣的疑惑,這位仁兄做了實驗,發現Optional的情況和預期一致,所以不用管了。

It just works!

那就更疑惑了,沒寫程式碼怎麼就可以用呢,好在swift是開源的,我們可以一路找到swift是如何實現這樣的功能的。

然後就在Optional.swift的中看到了這樣的程式碼,就是他替我們處理了Optional的情況(我們省略了大量的註釋,建議大家看下注釋內容,寫得非常仔細)

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;

剩下的情況就都返回false。

參考資料

Optional.swift

swift-equatable-with-optionals

相關文章