在 Swift 裡,Class
(類別)和 Struct
(結構體)是兩種用來存放資料和功能的「容器」。雖然它們看起來很像,但其實有一些重要的不同。以下會用簡單的方式來解釋。
Class
和 Struct
都可以:
範例:
struct DogStruct {
var name: String
func bark() {
print("\(name) says Woof!")
}
}
class DogClass {
var name: String
init(name: String) {
self.name = name
}
func bark() {
print("\(name) says Woof!")
}
}
Struct 是「值」型別
意思是當你複製一個 Struct
時,你得到的是一份「全新副本」。改動副本不會影響原本的資料。
Class 是「參考」型別
意思是當你複製一個 Class
,你得到的是同一個物件的「連結」。改動其中一個,會改動所有連結到這個物件的地方。
範例:
struct PointStruct {
var x: Int
var y: Int
}
class PointClass {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var point1 = PointStruct(x: 5, y: 10)
var point2 = point1 // 複製了一份新的
point2.x = 20
print(point1.x) // 還是 5,因為 point1 和 point2 是不同的
var point3 = PointClass(x: 5, y: 10)
var point4 = point3 // 兩個指向同一個物件
point4.x = 20
print(point3.x) // 變成 20,因為 point3 和 point4 是連結到同一個物件
Class 支援繼承
一個 Class
可以從另一個 Class
繼承,這樣可以重複使用屬性和方法,還可以改寫它們。
Struct 不支援繼承
Struct
無法繼承其他 Struct
或 Class
。
範例:
class Animal {
func sound() {
print("Some sound")
}
}
class Dog: Animal {
override func sound() {
print("Woof!")
}
}
let dog = Dog()
dog.sound() // 印出 "Woof!"
Struct 是「值拷貝」,儲存在棧(stack)裡
當你複製 Struct
,它會在棧上建立一個新的副本。
Class 是「參考計數」,儲存在堆(heap)裡
Class
的實例使用引用計數來管理。每次你複製 Class
,只是增加了對同一個物件的引用。
Struct 預設是不可變的(當你用 let
宣告)
如果你用 let
宣告一個 Struct
,你不能修改它的屬性。
Class 即使用 let
宣告,屬性還是可以變
即使你用 let
宣告一個 Class
,它的屬性還是可以改變,因為你改變的是物件內部的東西,不是物件本身。
範例:
struct PersonStruct {
var name: String
}
class PersonClass {
var name: String
init(name: String) {
self.name = name
}
}
let person1 = PersonStruct(name: "John")
// person1.name = "Mike" // 錯誤,因為 person1 是常量
let person2 = PersonClass(name: "John")
person2.name = "Mike" // 可以改,因為 person2 是一個類別物件的參考
使用 Struct 的時候
使用 Class 的時候
Struct
比較適合簡單、單一用途的資料結構,像是座標、尺寸等。Class
比較適合用在有複雜邏輯,或需要共享資料的場景。希望這些簡單的解釋能幫助你更容易理解 Class
和 Struct
的不同!