Swift-為什麼實現Equatable不需要處理Optional
引言
當我們想要比較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。
參考資料
相關文章
- 為什麼MyBatis的Mpper介面不需要實現類?MyBatis
- 為什麼我喜歡JavaScript的Optional ChainingJavaScriptAI
- 李理:為什麼說人工智慧可以實現?人工智慧
- 華為處理器為什麼叫海思麒麟?
- 為什麼Linux不需要碎片整理?Linux
- 為什麼你可能不需要GraphQL?
- 為什麼說流處理即未來?\n
- python 中為什麼不需要過載Python
- 淺談 CSS 前處理器(一):為什麼要使用前處理器?CSS
- Windows為什麼會出現埠占用?如何處理埠異常佔用?Windows
- Go 為什麼不像 Rust 用 ?!做錯誤處理?GoRust
- 什麼是流處理
- 什麼是批處理
- 什麼是NLP,NLP主要有什麼用,為什麼要學自然語言處理?自然語言處理
- node.js為什麼能處理高併發情景?Node.js
- 為什麼 ConcurrentHashMap 的讀操作不需要加鎖?HashMap
- Linux為什麼不需要防病毒軟體Linux
- WebSocket 是什麼原理?為什麼可以實現持久連線?Web
- WebSocket 是什麼原理?為什麼可以實現持久連線Web
- 為什麼處理排序的陣列要比非排序的快排序陣列
- sql 預處理為什麼可以放置SQL隱碼攻擊SQL
- 為什麼處理排序陣列比未排序陣列快排序陣列
- 為什麼處理有序陣列比無序陣列快?陣列
- matlab影象處理為什麼要歸一化和如…Matlab
- 銳龍處理器和酷睿處理器哪個好 為什麼都不建議買銳龍處理器
- [譯] 為什麼需要在 React 類元件中為事件處理程式繫結 thisReact元件事件
- java事件處理模型是什麼Java事件模型
- 什麼是雙核處理器?
- Phper 學 C 興趣入門 -為什麼有的字串處理這麼難PHP字串
- 為什麼?為什麼?Java處理排序後的陣列比沒有排序的快?想過沒有?Java排序陣列
- 異常是什麼和怎麼去處理!--
- 為什麼他需要豎向對齊程式碼,而你不需要
- 【知乎精選】產品經理怎麼判別一個功能需不需要實現?
- 為什麼 JavaScript 會無處不在?JavaScript
- 簡單實現批處理
- 為什麼說Python適合做大資料處理?原因竟是它!Python大資料
- 為什麼ES6新增了Promise物件來處理非同步呼叫Promise物件非同步
- 實現鍵值對儲存(一):什麼是鍵值對儲存,為什麼要實現它