Swift實(shí)現(xiàn)“或”操作符的3種方法示例
前言
我在看喵神的書的時(shí)候,發(fā)現(xiàn)書中有個(gè)練習(xí)(如下圖),我覺得挺有意思,就把其中的“||”操作符實(shí)現(xiàn)了一下,跟大家分享一下。
使用Swift實(shí)現(xiàn)“||”操作符,我發(fā)現(xiàn)有三種方式,各自特點(diǎn)如下:
- 第一種:普通方式
- 第二種:性能優(yōu)化
- 第三種:性能優(yōu)化+寫法優(yōu)雅
“||”操作符,其實(shí)就是比較其左右兩側(cè)的值。所以我先定義一個(gè)常量vLeft代表左側(cè)的值。因?yàn)橛覀?cè)的值比較特殊,所以我定義了一個(gè)返回值為Bool值的函數(shù)getRightRes來獲取右側(cè)的值,代碼如下:
let vLeft = 31 > 12 // 代表操作符左側(cè)的值 // 代表操作符右側(cè)的值 func getRightRes() -> Bool { print("getting the right value...") return 2 < 10 }
第一種:
這是最普通,也是最容易想到的方式。函數(shù)有兩個(gè)Bool類型的參數(shù),value1為true是直接返回true,value1為false時(shí),再判斷value2的值。代碼如下:
func or(_ value1: Bool, _ value2: Bool) -> Bool { if value1 { return true } if value2 { return true } return false }
然后使用定義好的值調(diào)用一下:
let res = or(vLeft, getRightRes()) print("or: \(res)\n")
打印結(jié)果為:
getting the right value...
or: true
大家有沒有發(fā)現(xiàn)一個(gè)問題,即使我左側(cè)的值vLeft為true了,獲取右側(cè)值的函數(shù)getRightRes依然被執(zhí)行了。試想如果右側(cè)函數(shù)是個(gè)比較消耗性能或費(fèi)時(shí)的操作,在已經(jīng)確定結(jié)果為true的情況下,再去執(zhí)行右側(cè)函數(shù),則非常沒有必要了!
那有沒有辦法解決這個(gè)問題呢?當(dāng)然有,請(qǐng)看第二種方式。
第二種:
這種方式使用了閉包的概念。函數(shù)的第一個(gè)參數(shù)還是Bool類型的值,但第二個(gè)參數(shù)改為了一個(gè)返回值為Bool類型的閉包。(我們會(huì)把getRightRes函數(shù)放在閉包中執(zhí)行)代碼如下:
func or(_ value1: Bool, _ value2: () -> Bool) -> Bool { if value1 { return true } return value2() }
這段代碼的意思就是,如果value1為true直接返回true,如果value1為false,則返回value2閉包的返回值。
這個(gè)函數(shù)的調(diào)用如下:
let res = or(vLeft) { () -> Bool in return getRightRes() } print("or: \(res)\n")
執(zhí)行結(jié)果如下:
or: true
大家發(fā)現(xiàn)沒有,在vLeft為true的情況下,并沒有再去調(diào)用getRightRes函數(shù)。這就解決了第一種方式中存在的問題。
現(xiàn)在我們把vLeft的值改為let vLeft = 3 > 12,再次運(yùn)行代碼,會(huì)發(fā)現(xiàn)結(jié)果如下:
getting the right value...
or: true
這就說明,在左側(cè)值value1為false的情況時(shí),會(huì)執(zhí)行value2的閉包,閉包中的函數(shù)getRightRes會(huì)被執(zhí)行,并返回結(jié)果。
這個(gè)函數(shù)的調(diào)用方式還可以簡(jiǎn)寫為如下方式:
let res = or(vLeft) { getRightRes() }
第三種:
這種方式只是在第二種方式的寫法上進(jìn)行了優(yōu)化,即在閉包參數(shù)的前面加了@autoclosure關(guān)鍵字,作用就是在調(diào)用這個(gè)函數(shù)的時(shí)候,寫法非常優(yōu)雅,你甚至都感受不到閉包的存在!代碼如下:
func or(_ value1: Bool, _ value2: @autoclosure() -> Bool) -> Bool { if value1 { return true } return value2() }
調(diào)用代碼:
let res = or(vLeft, getRightRes()) print("or: \(res)\n")
運(yùn)行結(jié)果是跟第二種方式是一樣的,但寫法上比第二種簡(jiǎn)潔了很多。跟第一種普通方式的調(diào)用代碼竟然是一模一樣的。
以上就是我總結(jié)的使用Swift實(shí)現(xiàn)“或”操作符的三種方式了,希望對(duì)大家有幫助。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
swift4.2實(shí)現(xiàn)新聞首頁導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了swift4.2實(shí)現(xiàn)新聞首頁導(dǎo)航,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Swift實(shí)現(xiàn)表格視圖單元格單選(1)
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)表格視圖單元格單選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理詳解
這篇文章主要給大家介紹了關(guān)于Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01在Swift程序中實(shí)現(xiàn)手勢(shì)識(shí)別的方法
這篇文章主要介紹了在Swift程序中實(shí)現(xiàn)手勢(shì)識(shí)別的方法,蘋果的Swift語言即將進(jìn)入2.0開源階段,人氣爆棚中:D 需要的朋友可以參考下2015-07-07