裝個逼:自定義三元運算子

叫什麼都不如叫Pluto-Y發表於2016-10-13

最近剛看完@喵神翻譯的函式式Swift這本書(有興趣的小夥伴可以去買來看看,記得支援正版喲~),然後就想說說 Swift 中的自定義操作符,這個在函數語言程式設計中也是非常有意義的工具。例如在 Applicative Functor 中的 Monad 中的 >>= 在我們自己實現函數語言程式設計中都有可能需要自定義來實現這兩個操作符。另外,除了在函數語言程式設計裡,我們平常的程式設計工作中也有經常遇到需要過載或者自定義操作符的時候,例如實現了 Equatable 協議的情況下就需要重寫 == 操作符。

但是這裡並不是手把手教你如何自定義操作符,而是來說說在 Swift 2 和 3 中自定義操作符有什麼不同吧,至於英文好的小夥伴可以參考SE-0077

在 Swift 2 的情況下,我們通常通過下面的程式碼來定義自己的操作符:

而在 Swift 3 中我們則通過下面方式來進行替代:

整體上來說 Swift 2 和 3 之間是沒有特別大的改動,只是將格式方面進行一種更加優雅的進化而已。雖然進行了這樣的調整,但是有一點讓寶寶不爽的是,已經定義的 group 在 Xcode 中竟然不給自動提示,特別是對於一些標準庫中已經定義的 group 竟然也不給提示,這就讓寶寶不開心了。目前的解決方案就是通過SE-0077這裡來查詢。

好了,最後我們來簡單說說如何實現三元操作符吧,也當是給個自定義操作符的小結。我們都知道 Swift 跟其他大多數語言一樣,對於三元操作符只提供了條件操作符 _ ? _ : _ ,那麼如果我們想自己定義三元操作符怎麼辦呢?記得有一句話是這麼說的,方法總比問題多~

其實我們可以創造一個偽三元操作符,就是用兩個二元操作符來結合產生一個三元操作符,例如我們用 _ ??? _ ||| _ 來實現一下條件操作符的功能。首先我們先定義一下兩個操作符:

為什麼這裡的 OrGroup 要用 higherThan: QuesGroup 呢?我們設想一下,如果是 QuesGroup 中用 higherThan: OrGroup 的話,那麼我們自定義的條件表示式就變成了 (_ ??? _) ||| _ 這種形式了,而是不是 _ ??? (_ ||| _) 這種形式。

其次我們來考慮一下條件操作符的流程,它是先檢視?前的布林值,然後再根據布林值來決定返回哪一個部分,那麼我們可以認為後面一部人是需要一個布林值作為引數,返回資料的方法。並且根據其有短路的功能,我們可以採用 @autoclosure 來實現延遲載入以及短路的功能。並且根據上面的說法我們知道第二個引數和第三個引數其實是一個整體,並且根據前面來返回一個值。具體實現就如下面:

程式碼非常簡單,測試程式碼就更簡單了:

到這裡就搞定了自定義”三元操作符”了~炒雞簡單。那麼既然回了三元,那要定義四元,五元甚至更多元都可以採用相同的方式。只要分析好邏輯,並寫出來就好了,好吧~就這樣了。

寶寶去被窩裡藍瘦,香菇了~在錄一個視訊嚇死你們

PS:具體程式碼可以從Github上獲取。

如有問題或糾正, 可以聯絡@叫什麼都不如叫Pluto-Y或在Github

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

裝個逼:自定義三元運算子 裝個逼:自定義三元運算子

相關文章