Swift之||,&&凛剥,?轻姿?的實(shí)現(xiàn)及原理

前言

上篇Swift中@autoclosure模擬了或運(yùn)算犁珠,這篇繼續(xù)探討或運(yùn)算,看看Swift中或運(yùn)算是如何實(shí)現(xiàn)的互亮。

或運(yùn)算

下圖是Playground中的或運(yùn)算犁享,沒(méi)什么需要解釋的。


1.png

點(diǎn)進(jìn)去看下或運(yùn)算是怎么實(shí)現(xiàn)的豹休。

2.png

只能看到這么個(gè)函數(shù)炊昆,這個(gè)函數(shù)有沒(méi)有很眼熟,沒(méi)錯(cuò)跟這篇Swift中@autoclosure文章中的差不多威根,只不過(guò)我沒(méi)有用泛型而已凤巨。既然看不到實(shí)現(xiàn),不防我們自己給他實(shí)現(xiàn)個(gè)洛搀。其實(shí)我們上篇文章中已經(jīng)實(shí)現(xiàn)了敢茁,這里溫習(xí)一下。
為了方便起見(jiàn)留美,我就不寫(xiě)||彰檬,寫(xiě)一個(gè)函數(shù)

func test<T : BooleanType>(lhs: T, @autoclosure rhs: () throws -> Bool) rethrows -> Bool {
    if lhs {
        return true
    }
    do {
       return try rhs()
    } catch {
        return false
    }
}

右邊表達(dá)式有throws關(guān)鍵字,是要做異常處理的谎砾,這是swift2.0加的異常處理逢倍,這也是為什么很多從網(wǎng)上下載下來(lái)的代碼,以前用if else的那些景图,現(xiàn)在好多都不能用较雕,報(bào)錯(cuò)的原因。關(guān)于異常處理症歇,自行百度吧郎笆,網(wǎng)上一堆谭梗。其實(shí)這里是偷懶的做法,catch里應(yīng)該做一場(chǎng)處理宛蚓,不是直接返回false激捏,下面給個(gè)參考做法,之后的就不做一場(chǎng)處理了凄吏。(偷個(gè)懶)

func test<T : BooleanType>(lhs: T, @autoclosure rhs: () throws -> Bool) rethrows -> Bool {
    if lhs {
        return true
    }
    var error:NSError
    var result:Bool?
    do {
       result = try rhs()
    } catch let error1 as NSError {
        error = error1
        print("\(error.userInfo)")
    }
    return result!
}

調(diào)用一下看看結(jié)果如何


3.png

左邊表達(dá)式的結(jié)果為true远舅,所以第44行直接返回了結(jié)果,右邊表達(dá)式?jīng)]有判斷痕钢,也沒(méi)有必要判斷图柏。(這里不解釋?zhuān)?/p>

4.png

上面第一個(gè)表達(dá)式為false,直接return第二個(gè)表達(dá)式任连。后面的結(jié)果為true蚤吹,也符合預(yù)期。
5.png

這個(gè)和圖4一樣随抠,第一個(gè)表達(dá)式為false裁着,直接返回第二個(gè)表達(dá)式。只不過(guò)這里第二個(gè)表達(dá)式是false拱她。
有人可能會(huì)提出這樣的疑問(wèn)二驰,為什么系統(tǒng)方法是這么調(diào)用的

1>2 || 2<3

你的卻是這樣調(diào)用的

test(1>2, rhs: 2<3)

因?yàn)槲沂怯闷胀ǖ暮瘮?shù)實(shí)現(xiàn)的,系統(tǒng)的是用運(yùn)算符實(shí)現(xiàn)的秉沼。我們點(diǎn)進(jìn)去看下文檔有什么不一樣的撬呢。

運(yùn)算符

6.png

搜一下哨颂,哎,果然有點(diǎn)線索。再找找衡怀。

7.png

好家伙介牙,要的就是這句話房待。 operator不就是運(yùn)算符嗎(英語(yǔ)還不錯(cuò))柬脸。而且每個(gè)都有precedence一個(gè)數(shù)字,而且數(shù)字有大有小都不一樣妄均,如果沒(méi)猜錯(cuò)的話應(yīng)該就是表示優(yōu)先級(jí)的柱锹。每個(gè)前面還有個(gè)infix,這是什么呢?(英語(yǔ)大神不要鄙視丰包,我英語(yǔ)六級(jí)都沒(méi)過(guò)禁熏,這個(gè)單詞真不認(rèn)識(shí))再往下翻翻。


8.png

好家伙邑彪,pre這個(gè)我能看懂瞧毙,"!"取非運(yùn)算符前面是pre,是運(yùn)算符在前面的,只有后面有表達(dá)式宙彪。那infix應(yīng)該就是中位運(yùn)算符矩动,前后都有表達(dá)式。associativity(結(jié)合性)释漆,就是結(jié)合律了悲没,左結(jié)合,右結(jié)合男图。

廢話有點(diǎn)多了示姿,知道怎么回事,開(kāi)始實(shí)現(xiàn)吧
為了與系統(tǒng)||運(yùn)算符區(qū)分開(kāi)來(lái)逊笆,我們用|||多寫(xiě)一個(gè)豎線栈戳。
很簡(jiǎn)單,照抄一遍难裆,就是多加一個(gè)“|”

9.png

完美實(shí)現(xiàn)子檀,跟系統(tǒng)的效果一樣
看下手寫(xiě)代碼

func |||<T : BooleanType>(lhs: T, @autoclosure rhs: () throws -> Bool) rethrows -> Bool {
    if lhs {
        return true
    }
    
    do {
        return try rhs()
    } catch {
        return false
    }
}

infix operator ||| {
    associativity left
    precedence 110
}

1<2 ||| 2>3
1<2 ||| 2<3
1>2 ||| 2>3

總結(jié)

關(guān)于&&和?乃戈?這里就不再寫(xiě)了命锄,想要代碼的話,可以在評(píng)論里留言偏化。(建議最好自己寫(xiě)一遍)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市镐侯,隨后出現(xiàn)的幾起案子侦讨,更是在濱河造成了極大的恐慌,老刑警劉巖苟翻,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韵卤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡崇猫,警方通過(guò)查閱死者的電腦和手機(jī)沈条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诅炉,“玉大人蜡歹,你說(shuō)我怎么就攤上這事√樯眨” “怎么了月而?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)议纯。 經(jīng)常有香客問(wèn)我父款,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任憨攒,我火速辦了婚禮世杀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肝集。我一直安慰自己瞻坝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布包晰。 她就那樣靜靜地躺著湿镀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伐憾。 梳的紋絲不亂的頭發(fā)上勉痴,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音树肃,去河邊找鬼蒸矛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胸嘴,可吹牛的內(nèi)容都是我干的雏掠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼劣像,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乡话!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耳奕,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绑青,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后屋群,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體闸婴,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年芍躏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邪乍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对竣,死狀恐怖庇楞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柏肪,我是刑警寧澤姐刁,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站烦味,受9級(jí)特大地震影響聂使,放射性物質(zhì)發(fā)生泄漏壁拉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一柏靶、第九天 我趴在偏房一處隱蔽的房頂上張望弃理。 院中可真熱鬧,春花似錦屎蜓、人聲如沸痘昌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辆苔。三九已至,卻和暖如春扼劈,著一層夾襖步出監(jiān)牢的瞬間驻啤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工荐吵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骑冗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓先煎,卻偏偏與公主長(zhǎng)得像贼涩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薯蝎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容