Swift實現“或”操作符的三種方式
我在看喵神的書的時候,發現書中有個練習(如下圖),我覺得挺有意思,就把其中的“||”操作符實現了一下,跟大家分享一下。

使用Swift實現“||”操作符,我發現有三種方式,各自特點如下:
- 第一種:普通方式
- 第二種:效能優化
- 第三種:效能優化+寫法優雅
“||”操作符,其實就是比較其左右兩側的值。所以我先定義一個常量 vLeft
代表左側的值。因為右側的值比較特殊,所以我定義了一個返回值為Bool值的函式 getRightRes
來獲取右側的值,程式碼如下:
let vLeft = 31 > 12// 代表操作符左側的值 // 代表操作符右側的值 func getRightRes() -> Bool { print("getting the right value...") return 2 < 10 }
第一種:
這是最普通,也是最容易想到的方式。函式有兩個Bool型別的引數, value1
為true是直接返回true, value1
為false時,再判斷 value2
的值。程式碼如下:
func or(_ value1: Bool, _ value2: Bool) -> Bool { if value1 { return true } if value2 { return true } return false }
然後使用定義好的值呼叫一下:
let res = or(vLeft, getRightRes()) print("or: \(res)\n")
列印結果為:
getting the right value... or: true
大家有沒有發現一個問題,即使我左側的值 vLeft
為true了,獲取右側值的函式 getRightRes
依然被執行了。試想如果右側函式是個比較消耗效能或費時的操作,在已經確定結果為true的情況下,再去執行右側函式,則非常沒有必要了!
那有沒有辦法解決這個問題呢?當然有,請看第二種方式。
第二種:
這種方式使用了閉包的概念。函式的第一個引數還是Bool型別的值,但第二個引數改為了一個返回值為Bool型別的閉包。(我們會把 getRightRes
函式放在閉包中執行)程式碼如下:
func or(_ value1: Bool, _ value2: () -> Bool) -> Bool { if value1 { return true } return value2() }
這段程式碼的意思就是,如果 value1
為true直接返回true,如果 value1
為false,則返回 value2
閉包的返回值。
這個函式的呼叫如下:
let res = or(vLeft) { () -> Bool in return getRightRes() } print("or: \(res)\n")
執行結果如下:
or: true
大家發現沒有,在vLeft為true的情況下,並沒有再去呼叫 getRightRes
函式。這就解決了第一種方式中存在的問題。
現在我們把vLeft的值改為 let vLeft = 3 > 12
,再次執行程式碼,會發現結果如下:
getting the right value... or: true
這就說明,在左側值 value1
為false的情況時,會執行 value2
的閉包,閉包中的函式 getRightRes
會被執行,並返回結果。
這個函式的呼叫方式還可以簡寫為如下方式:
let res = or(vLeft) { getRightRes() }
第三種:
這種方式只是在第二種方式的寫法上進行了優化,即在閉包引數的前面加了 @autoclosure
關鍵字,作用就是在呼叫這個函式的時候,寫法非常優雅,你甚至都感受不到閉包的存在!程式碼如下:
func or(_ value1: Bool, _ value2: @autoclosure() -> Bool) -> Bool { if value1 { return true } return value2() }
呼叫程式碼:
let res = or(vLeft, getRightRes()) print("or: \(res)\n")
執行結果是跟第二種方式是一樣的,但寫法上比第二種簡潔了很多。跟第一種普通方式的呼叫程式碼竟然是一模一樣的。
以上就是我總結的使用Swift實現“或”操作符的三種方式了,希望對大家有幫助。
Have fun.