前面兩篇文章學習了 Struct 和 Class,
兩者用法相同、功能相似,
都可以用來儲存 property、定義 method,
具體可見官方文件:
https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
這篇文章主要會具體討論 Struct 與 Class 的差異。
首先宣告一個新的 struct,
我們可以發現只宣告了一個實例卻產生了兩個不同的值,
這是因為宣告
var b = MyStruct()
var c = b
相當於宣告了 b、c 是兩個不同的實例,
所以會出現兩個不同的結果。
這是 Struct 作為 value type 的特殊屬性:
當你宣告一個新變數給 value type,
或者把它傳給一個 Function,
實際上它就是 copy 了一個副本並進行傳遞。
接下來傳遞一個參數 e 進入 myFunction(),
e 的 value type 是這個 struct:
Xcode 顯示一個 error,
讓我們調用 myFunction(),
並傳入變數 b,
它將宣告 b 的副本並傳遞到 myFunction() 中:
可以看到 Xcode 不允許更改副本,
只有當直接賦值給變數,
才能更改 value type:
讓我們有一個新的 playground:
結果我們得到了同樣的結果。
這是因為 Class 是 reference type,
它是作為 reference 作用傳遞的。
這意味著變數 b、c 指向同一個 class 的實例,
所以最後打印出來的結果反映的是最後一次的變更。
讓我們調用 myFunction() 試試:
會發現打印出相同的結果。
這是因為 Class 是 reference type。