雖然昨天說了今天要來介紹 Property Wrapper,不過在介紹之前,我們先來了解一下資料類型。
首先在 Swift 中資料類型分為兩種,value type 和 reference type,它們的差別主要是在於存取及資料傳遞的方式。
下面在 playground 來解釋一下兩種資料類型的差別。
首先是 value type,這裡用 Struct 來示範,可以看到這裡先建立了一個叫做 test 的 Struct,然後再分別建立兩個變數。
可以看到這裡把 valuetype2 設成 valuetype 之後將 valuetype2 的值改變,然後同時印出兩個變數的值,會發現印出來的值不一樣。
這是 value type 的特性造成的,雖然程式上看起來是讓 valurtype2 等同於 valuetype,但他其實在背後是再創造一個 Struct 來儲存 valuetype2 的值,這就導致兩個變數其實是不一樣的兩筆資料。
那看完 value type,接下來來看看 reference type,可以看到這裡照著上面 value type 的方式去操作,結果卻得出完全不一樣的結果。
這就是 reference type 的特性,雖然建立了兩個不同的變數,但他們指向的位址都是同一個 class,這代表在 referenceType2 修改的資料跟 referenceType 的資料是同一個。
value type 和 reference type,一個是在傳遞實際的值,另一個傳遞的是位址,而像是 class、閉包、actor 這些都是屬於 reference type 的,其他的類型像是 Struct、Int、Array 這些就是屬於 value type 的。
今天就是稍微解釋一下兩種資料類型,這樣在後面介紹 Property wrapper 時也比較好理解某些內容,而關於資料類型還有很多東西,例如:ARC、retain cycle 和 weak、unowned 關鍵字等,這些就明天再來解釋吧。