剛學完 iOS 或是Swift ,或是在找工作時,大概10間有考技術的公司中有8間會問 Struct 與 Class的差異。

幾乎所有人都可以正確地講出能否繼承的差異,但是除了繼承以外,instance (實例)的用法與記憶體的管理方式差異,可能會是開發上真正決定要用 class 或是 struct 的關鍵。

差異的重點在於,我們要如何使用,會是更有效率、更有意義的,而不僅是面試或考試的時候能夠回答。

那麼,就來整理一下目前我所認知到的差異,以及對開發上的影響吧!

1. Value Type v.s. Instance Type

對我來說,這是感受最深刻的差異。

以定義Car 來說,我們可以創建一個Car的 class 也可以創建一個Car 的struct

class Car {
    var color: String
    var brand: String
    var doors: Int

    init(color: String, brand: String, doors: Int) {
        self.color = color
        self.brand = brand
        self.doors = doors
    }
}

struct Car {
    var color: String
    var brand: String
    var doors: Int

    init(color: String, brand: String, doors: Int) {
        self.color = color
        self.brand = brand
        self.doors = doors
    }
}

兩者可以在結構上一模一樣。

但是在使用時,會有不一樣的結果。

var car1 = Car(color: "red", brand: "Ford", doors: 5)
var car2 = car1  // car2 and car1 now refer to the same Car instance

// Modifying car2 also modifies car1 because they are the same instance
car2.color = "blue"
print(car1.color)  // Outputs "blue"
print(car2.color)  // Outputs "blue"

在 Class 的情況下,car2 就是car1。這兩個是同一台車。只是給同一台車取了不同的名字。

你不管呼叫car2或是car1,都是一樣的結果。

修改了car1,car2也會跟著改變。

這是reference type的意思。當下面這行

var car2 = car1 被定義時,其實是在告訴car2要參考的記憶體位置。

var car1 = Car(color: "red", brand: "Ford", doors: 5)
var car2 = car1  // car2 and car1 now refer to the same Car instance

// Modifying car2 also modifies car1 because they are the same instance
car2.color = "blue"
print(car1.color)  // Outputs "blue"
print(car2.color)  // Outputs "blue"

在 Struct 的情況下,car2 與 car1 是截然不同的兩台車。

呼叫car2的參數或method,會依據car2得到結果。

修改了car1,car2的內容不會跟著改變。

這是 value type 的意思

var car2 = car1 被定義時,其實是在創造一個car2,然後帶入的參數都跟car1一樣。

2. Instance and Type Characteristics

兩者都有分Instance Method 跟 Type Method。

詳情請看 Type Method v.s. Instance Method