RxSwift之路 1#Swift语法知识准备
在開始學習 RxSwift 之前,一定要對 Swift 相關(guān)語法有所了解,否則就很難理解為什么可以這樣。關(guān)于 Swift 的學習其實只要看看 Swift 的官方文檔就可夠了。我之前也列過一些學習資源:來自一線開發(fā)者的Swift學習資源推薦。
現(xiàn)在開始進入正題。
Swift的優(yōu)勢
想一個有趣的問題,為什么沒有 RxObjc 呢?
實際上響應(yīng)式的編程框架對語言還是有些要求的,當然 OC 確實也有一個奠基式的 FRP 框架 ReactiveCocoa。但是客觀的說,在 Swift 里響應(yīng)式的框架寫起來會愉快的多,或者說更能發(fā)揮出語言的優(yōu)勢。
Swift 契合響應(yīng)式有以下幾點:
- 強類型,強類型的泛型
- 靈活的閉包
- 對并發(fā)模型的原生支持(Swift 5 的特性,還未發(fā)布)
Enum的關(guān)聯(lián)值和泛型
Swift 中的枚舉(Enum)能力相比 OC 可以說得到了升華。不再只是一個類似預(yù)編譯時的宏,而是一個完整的類型。和 Struct 一樣,可以給他定義初始化方法,聲明函數(shù),添加擴展。同樣的泛型同樣也試用于 Enum。
枚舉還有一項神奇的能力叫關(guān)聯(lián)值。一個枚舉可以的值可以是不同的類型。官方手冊里的示例代碼如下:
每個 case 可以攜帶不同的類型,并且可以不止是一個值。
當 Enum 結(jié)合泛型,就發(fā)生了有趣的事。直接貼代碼:
這就是 Swift 中的 Optional 實現(xiàn)的類似代碼。使用枚舉實現(xiàn),表示值有兩種可能:沒有值的 .none 和是 Wrapped 類型的 .some。
有了以上的知識我們再來看 Rx 中的事件流中的值Event:
每一次事件的值有三種可能:1.值(next),2.完成結(jié)束(completed),3.失敗(error)。
函數(shù)的默認參數(shù)
如果函數(shù)在聲明時設(shè)置了一個默認值,那么在調(diào)用時這個參數(shù)就可以不傳。
假設(shè)我們給 Int 定義個擴展方法increment。如果不傳入值則默認加1,如果傳入就按照傳入的值增加:
使用的時候 Xcode 就會提示兩個函數(shù):
不再需要像 OC 一樣定義幾個函數(shù)。
Rx 表示訂閱的subscribe函數(shù),有時只要寫onNext,有時只要寫onError,就是因為這個函數(shù)在聲明時同時指定了默認參數(shù): extension ObservableType {public func subscribe(file: String = #file,line: UInt = #line,function: String = #function,onNext: ((E) -> Void)? = nil,onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil,onDisposed: (() -> Void)? = nil)-> Disposable {// ...}復(fù)制代碼
可以看到這個函數(shù)為訂閱每個事件可能都聲明了默認參數(shù),所以你在訂閱時可以只訂閱自己關(guān)注的訂閱。
閉包
閉包的使用類似 OC 中的 block,具體使用就不再介紹。提一下新手很容易忽略的語法糖。
閉包簡化語法
- 閉包參數(shù)、返回值類型自動推斷
因為 Swift 是強類型語言,閉包的參數(shù)的類型可以推斷出來。比如如下代碼:reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool inreturn s1 > s2 })復(fù)制代碼s1 和 s2 的類型和返回值類型 Xcode 可以推斷出來可以省略:reversedNames = names.sorted(by: { (s1, s2) inreturn s1 > s2 })復(fù)制代碼 - 閉包表達式只有一行,可以省略return
因為只有一行,表達式執(zhí)行的結(jié)果肯定就是要返回的值,所以可以省略。接上面的代碼可以優(yōu)化成這樣:reversedNames = names.sorted(by: { (s1, s2) in s1 > s2 })復(fù)制代碼 - 用$N代替參數(shù)
有時實參的參數(shù)名沒什么用,可以直接用$N代表實參,$0代表第一個參數(shù)。上面的代碼進行這樣的簡化后就寫成了這樣:reversedNames = names.sorted(by: { $0 > $1 })復(fù)制代碼 - 二元運算時可以直接省略只用操作符表示
當表達式只有一行時,二元運算的表達式可以直接省略到只剩一個運算符,上面的可以省略為:reversedNames = names.sorted(by: >)復(fù)制代碼
尾閉包
當參數(shù)的最好一個參數(shù)是閉包時,可以直接把最后一個閉包的實現(xiàn)跟在函數(shù)后面。
直接貼代碼表示:
這種寫法簡化了代碼,讓代碼看起來更簡潔。
Rx 中的數(shù)據(jù)流操作符可以靈活的組織閉包,經(jīng)常會用到簡化的閉包的語法。
Observable.of(1, 2, 3, 4, 5, 6).filter { $0 % 2 == 0}.subscribe(onNext: {print($0) })復(fù)制代碼剛開始的時候可能有點看不明白,慢慢的還原閉包的語法,之后看多了就會熟悉的。
歡迎關(guān)注我的微博:@沒故事的卓同學
總結(jié)
以上是生活随笔為你收集整理的RxSwift之路 1#Swift语法知识准备的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历经32载,域名仍是少年,更何况不足2岁
- 下一篇: 【第五组】头脑风暴+核心竞争力+NABC