code

2017年11月1日 星期三

Stanford ios 10 with Swift 筆記7 - Swift 2

Error handling

一個function可以丟出exception:


而client要catch這個exception要在do {} block中:



如果要讓catch的exception直接crash (或許debug時候會用到):


下面這個語法就很好,如果沒throw exception就assign值否則nil,Java類似的語法就很難寫:



Extension

這個真的是Kotlin / Swift很棒的語法機制,可以直接對某個class / struct / enum 加上新的methods或是computed properties (only),甚至可以implement protocols


這邊的self就是type UIViewController。


Protocols

就是Java interface (first-class type),但是可以有properties,另外methods可以有default implementation,相當好用。
在swift稱為conform to protocol。

由於protocol是valid type,所以他也可以像classes依樣做inheritance,而且是multiple-inheritance。


如果這個protocol只能被class implement,那就要加上class keyword
如果要強制繼承者init某些參數,要加上init() function,如果是class繼承者的話,需要initf前面加上required。

client宣告如下:



比較奇怪的是,為了與objective C相容,Swift protocol可以有optional methods!!

另外multiple protocols的繼承者 也是一個type,語法如下:


protocol type當然可以用在generics type T:



最後 protocols / extensions 都沒有storage,也就是不會有state,這充分展現了functional programming的精神。



Delegation

delegate其實就是一個最簡單利用protocol的範例。

View設立一個weak reference type variable叫做"delegate",並且定義了一個protocol讓這個delegate 去 implement,所以這個delegate的type就是這個protocol。

這個delegate的功能就是讓View去指揮ViewController做某些事情,在某些情況下。
所以ViewController會implement這個protocol (有一些是optional),並且把這個View的 delegate設定成自己。

由於是透過protocol溝通,所以View和ViewController完全脫鉤。

不過某些時候其實用closure會比用delegation好得多,至少簡潔度來講。



沒有留言:

張貼留言