Swift class 與 struct 差異

class 與 struct

在 Swift 中,有兩種不同的型別宣告,分別是 classstruct,那他們到底會有什麼差異呢 ? 什麼時候該使用 class , 什麼時候使用 struct呢 ?

Imgur

從上圖表格中我們可以發現兩者的差異。

Copy By Reference And Copy By Value

首先可以看到第一個差異性便是 classCopy By ReferencestrcutCopy By Value 。下面我們舉一個簡單的例子說明兩者的差異。

1
2
3
4
5
6
7
8
9
10
class number {
var num: Int
init (num: Int) {
self.num = num
}
}

var a = number (n: 5)
var b = a
b.num = 2

當將 呼叫 b = a 時,b 其實是 指向 a 的一個 Reference,他們其實參考到的都是同一段記憶體位置,所以當呼叫 b.num = 2 時,其實同時也讓 a.num 的值也等於 2 了,因為他們使用的是同一個 Reference 實體。

接下來我們將 class 替換成 struct :

1
2
3
4
5
6
7
8
9
10
struct number {
var num: Int
init (num: Int) {
self.num = num
}
}

var a = number (n: 5)
var b = a
b.num = 2

但是由於 StructCall 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)