code

2017年10月19日 星期四

Stanford ios 10 with Swift 筆記2 - Swift 1

Optional只是一個enum


some case的type T 就是associated value的type。
所以以下兩者是相同的宣告:



所以用unwrap !符號等於是對enum的switch case,如果是some(T) instance的話,就回傳unpacked associated value,否則raise exception。


但是如果是用if let 來嘗試unwrap的話,邏輯如同以下的enum switch case:


所以是安全的,y頂多就還是nil,不會raise exception。

跟kotlin不一樣,比較有趣的是可以用個1-liner來設定default value:


Tuples

這樣宣告:



Range

range是一個struct,type T必須要comparable:


inclusive or exclusive:

所以以上也是array slicing的方式。

Range<Int>是一個CountableRange,所以可以被enumerate。


Value vs Reference

class instance (object)是referenced type,也就是利用pointer去access,而struct/enum是value type,也就是每次pass都是一份copy。Swift prefer functional programming,所以建議都用struct / enum。

FP approach更適合做testing,因為就是input -> output,沒有side effect。


Static methods

Swift也有type (class / struct) method,也用static keyword:



Properties

observer: swift能對property (就是instance variable)做computed property,也能做observer:



lazy: 也有lazy initialization pattern,所有的class property都需要被init才能使用,但如果這個property要在initialization階段呼叫自己的methods,那是不可能compile的。不過如果用上lazy就可以:



Array

Array是generic type,所以要宣告時要加上Array<Type>()。Array也是一個sequence,所以可以用for .. in 的語法去enumerate。

當然swift sequence也有FP的filter / map:



Dictionary

比較特別的是,利用key index出value,回傳是一個optional,這可以用let來safe unwrap:



String

要取出string中的某個index的character,可以用 s[String.Index],所以index不是int type,而是String.Index type,這邊要注意一下。


但以上不是slicing 的好方法。

String有一個property,是一個sequence可以用來enumerate。



Initialization

struct default對所有properties做init (所以有一個default constructor),但是如果真的給了一個initializer,則default init就沒了。

class只有未繼承他人者才有default init。init function就是某一個constructor。
很複雜,盡量不要用到classes in Swift XD


Any / AnyObject

AnyObject是為了相容objectiveC,所以沒啥好講的。
Any可以算是...就是any ,但是必須要convert成Optional:





沒有留言:

張貼留言