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
- 李理:為什麼說人工智慧可以實現?人工智慧
- 為什麼你可能不需要GraphQL?
- 為什麼說流處理即未來?\n
- Windows為什麼會出現埠占用?如何處理埠異常佔用?Windows
- 什麼是批處理
- 什麼是流處理
- Go 為什麼不像 Rust 用 ?!做錯誤處理?GoRust
- Linux為什麼不需要防病毒軟體Linux
- 為什麼 ConcurrentHashMap 的讀操作不需要加鎖?HashMap
- 什麼是NLP,NLP主要有什麼用,為什麼要學自然語言處理?自然語言處理
- node.js為什麼能處理高併發情景?Node.js
- 銳龍處理器和酷睿處理器哪個好 為什麼都不建議買銳龍處理器
- sql 預處理為什麼可以放置SQL隱碼攻擊SQL
- 為什麼處理排序陣列比未排序陣列快排序陣列
- 為什麼處理排序的陣列要比非排序的快排序陣列
- java事件處理模型是什麼Java事件模型
- [譯] 為什麼需要在 React 類元件中為事件處理程式繫結 thisReact元件事件
- 簡單實現批處理
- 異常是什麼和怎麼去處理!--
- WebSocket 是什麼原理?為什麼可以實現持久連線?Web
- Phper 學 C 興趣入門 -為什麼有的字串處理這麼難PHP字串
- 為什麼HTML5裡面我們不需要DTD?HTML
- 為什麼說Python適合做大資料處理?原因竟是它!Python大資料
- 為什麼?為什麼?Java處理排序後的陣列比沒有排序的快?想過沒有?Java排序陣列
- 前端路由指的是什麼?它有什麼好處?它有哪些方式可以實現呢?前端路由
- python資料處理是什麼意思Python
- php實現ffmpeg處理視訊PHP
- 為什麼ES6新增了Promise物件來處理非同步呼叫Promise物件非同步
- 為什麼 JavaScript 會無處不在?JavaScript
- 交貨處理可能不需要順序,因為訊息順序處理和伸縮性是很難平衡的 - particular
- Go語言的 序列處理 和 並行處理 有什麼區別 ?Go並行
- 什麼是殭屍程式以及如何處理
- python異常處理的流程是什麼?Python
- 為什麼defineProps宏函式不需要從vue中import匯入?函式VueImport
- 在 RT-Thread 中,ALIGN(4)為什麼不需要英文;結尾thread
- 如何利用Redis實現延時處理Redis