剛學完 iOS 或是Swift ,或是在找工作時,大概10間有考技術的公司中有8間會問 Struct 與 Class的差異。
幾乎所有人都可以正確地講出能否繼承的差異,但是除了繼承以外,instance (實例)的用法與記憶體的管理方式差異,可能會是開發上真正決定要用 class 或是 struct 的關鍵。
差異的重點在於,我們要如何使用,會是更有效率、更有意義的,而不僅是面試或考試的時候能夠回答。
那麼,就來整理一下目前我所認知到的差異,以及對開發上的影響吧!
對我來說,這是感受最深刻的差異。
以定義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一樣。
兩者都有分Instance Method 跟 Type Method。