iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
Mobile Development

少年K的Swift奇幻漂流記系列 第 9

Day9 Swift 基礎語法介紹 Part9

  • 分享至 

  • xImage
  •  

結構

Class vs Struct

在 Swift 裡,Class(類別)和 Struct(結構體)是兩種用來存放資料和功能的「容器」。雖然它們看起來很像,但其實有一些重要的不同。以下會用簡單的方式來解釋。

1. 共同點

ClassStruct 都可以:

  • 有屬性:用來存放資料。
  • 有方法:用來執行一些功能。
  • 有初始化方法:設定初始值。
  • 使用擴展(extension):可以增加功能。
  • 遵守協議(protocol):可以按照某些規則來提供功能。

範例:

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!")
    }
}

2. 主要差異

a. 值 vs 參考

  • 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 是連結到同一個物件

b. 繼承

  • Class 支援繼承
    一個 Class 可以從另一個 Class 繼承,這樣可以重複使用屬性和方法,還可以改寫它們。

  • Struct 不支援繼承
    Struct 無法繼承其他 StructClass

範例:

class Animal {
    func sound() {
        print("Some sound")
    }
}

class Dog: Animal {
    override func sound() {
        print("Woof!")
    }
}

let dog = Dog()
dog.sound()  // 印出 "Woof!"

c. 記憶體管理

  • Struct 是「值拷貝」,儲存在棧(stack)裡
    當你複製 Struct,它會在棧上建立一個新的副本。

  • Class 是「參考計數」,儲存在堆(heap)裡
    Class 的實例使用引用計數來管理。每次你複製 Class,只是增加了對同一個物件的引用。

d. 可變性

  • 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 是一個類別物件的參考

3. 什麼時候用 Class 或 Struct?

  • 使用 Struct 的時候

    • 當你只需要一份副本的資料。
    • 當你的資料不需要共享給別人。
    • 當你不需要繼承。
  • 使用 Class 的時候

    • 當你需要共享資料,或修改其中一個地方會影響到其他地方。
    • 當你需要繼承和多態性(父類和子類的關係)。

總結

  • Struct 比較適合簡單、單一用途的資料結構,像是座標、尺寸等。
  • Class 比較適合用在有複雜邏輯,或需要共享資料的場景。

希望這些簡單的解釋能幫助你更容易理解 ClassStruct 的不同!


上一篇
Day8 Swift 基礎語法介紹 Part8
下一篇
Day10 Swift APP 實作前基本功!
系列文
少年K的Swift奇幻漂流記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言