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。
如果要強制繼承者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好得多,至少簡潔度來講。
沒有留言:
張貼留言