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:
沒有留言:
張貼留言