Swift class 與 struct 差異
class 與 struct
在 Swift 中,有兩種不同的型別宣告,分別是 class
與 struct
,那他們到底會有什麼差異呢 ? 什麼時候該使用 class , 什麼時候使用 struct呢 ?
從上圖表格中我們可以發現兩者的差異。
Copy By Reference And Copy By Value
首先可以看到第一個差異性便是 class
是 Copy By Reference
、strcut
是 Copy By Value
。下面我們舉一個簡單的例子說明兩者的差異。
1 | class number { |
當將 呼叫 b = a
時,b
其實是 指向 a
的一個 Reference
,他們其實參考到的都是同一段記憶體位置,所以當呼叫 b.num = 2
時,其實同時也讓 a.num
的值也等於 2 了,因為他們使用的是同一個 Reference 實體。
接下來我們將 class 替換成 struct :
1 | struct number { |
但是由於 Struct
是 Call By Value
, 當呼叫 b = a
的時候,其實是將 a 的記憶體內容複製一份給 b
,所以 b 跟 a 是完全不同的記憶體位址,所以當修改b
中的變數時,並不會對 a
中的變數有任何改變。
Swift 中的繼承
在其他有 struct 的語言中(像是C++), struct 是可以被繼承的,但是在 Swift 中,只有 class 可以被繼承、 struct 是不可以被繼承的。
使用的時機
在 Apple 早期的 Swift 文件推薦開發者優先使用 class ; 一些近期的文件則推薦優先使用 struct。由於 class 物件是 reference type , 所以會被儲存在記憶體中的 heap ; struct 是 value type ,所以被存在 stack。根據一些線上的實測,越新版的 Swift , struct 效能越顯著的強大。 但是到底要用 class 還是 struct , 還是需要根據使用情境而斟酌選擇適合的。
其他共同的性質
- 都可以實作
protocol
- 都可使用
extension
,擴充 method - 都可以使用泛型(Generic)