Swift之||,&&,??的實現及原理

前言

上篇Swift中@autoclosure模擬了或運算,這篇繼續探討或運算,看看Swift中或運算是如何實現的。

或運算

下圖是Playground中的或運算,沒什么需要解釋的。


1.png

點進去看下或運算是怎么實現的。

2.png

只能看到這么個函數,這個函數有沒有很眼熟,沒錯跟這篇Swift中@autoclosure文章中的差不多,只不過我沒有用泛型而已。既然看不到實現,不防我們自己給他實現個。其實我們上篇文章中已經實現了,這里溫習一下。
為了方便起見,我就不寫||,寫一個函數

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

右邊表達式有throws關鍵字,是要做異常處理的,這是swift2.0加的異常處理,這也是為什么很多從網上下載下來的代碼,以前用if else的那些,現在好多都不能用,報錯的原因。關于異常處理,自行百度吧,網上一堆。其實這里是偷懶的做法,catch里應該做一場處理,不是直接返回false,下面給個參考做法,之后的就不做一場處理了。(偷個懶)

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!
}

調用一下看看結果如何


3.png

左邊表達式的結果為true,所以第44行直接返回了結果,右邊表達式沒有判斷,也沒有必要判斷。(這里不解釋)


4.png

上面第一個表達式為false,直接return第二個表達式。后面的結果為true,也符合預期。
5.png

這個和圖4一樣,第一個表達式為false,直接返回第二個表達式。只不過這里第二個表達式是false。
有人可能會提出這樣的疑問,為什么系統方法是這么調用的

1>2 || 2<3

你的卻是這樣調用的

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

因為我是用普通的函數實現的,系統的是用運算符實現的。我們點進去看下文檔有什么不一樣的。

運算符

6.png

搜一下,哎,果然有點線索。再找找。

7.png

好家伙,要的就是這句話。 operator不就是運算符嗎(英語還不錯)。而且每個都有precedence一個數字,而且數字有大有小都不一樣,如果沒猜錯的話應該就是表示優先級的。每個前面還有個infix,這是什么呢?(英語大神不要鄙視,我英語六級都沒過,這個單詞真不認識)再往下翻翻。


8.png

好家伙,pre這個我能看懂,"!"取非運算符前面是pre,是運算符在前面的,只有后面有表達式。那infix應該就是中位運算符,前后都有表達式。associativity(結合性),就是結合律了,左結合,右結合。

廢話有點多了,知道怎么回事,開始實現吧
為了與系統||運算符區分開來,我們用|||多寫一個豎線。
很簡單,照抄一遍,就是多加一個“|”

9.png

完美實現,跟系統的效果一樣
看下手寫代碼

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

總結

關于&&和??這里就不再寫了,想要代碼的話,可以在評論里留言。(建議最好自己寫一遍)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容