Swift 中類和結構體有什麼區別?


本指南將介紹 Swift 程式語言中的類和函式。此外,它們之間有什麼區別?

大多數情況下,當我們在專案中編寫程式碼時,必須處理類和結構體。確實,這兩個特性在 Swift 中是最重要的。在即時應用程式中,無論您想編寫什麼,都需要建立一個類來分配職責。

如果我們已經有類選項,我們需要了解為什麼以及何時應該使用結構體。

結構體是 Swift 語言中的一個基本概念,它們可以幫助使您的程式碼更易於重用、更靈活且耦合性更低。此外,它們還有助於提高您作為應用程式開發人員的技能。如何做到這一點?讓我們來看看。

首先,我們應該瞭解類和結構體的共同特徵:

我們可以在兩者中都以屬性(變數和常量)的形式儲存資訊。

  • 兩者都可以定義函式來執行某些任務。

  • 兩者都可以根據協議實現。

  • 我們都可以為兩者建立擴充套件。

  • 我們可以定義初始化器來設定屬性。

類具備但結構體不具備的功能

  • 您可以透過繼承父類來建立子類。

  • 您可以在類上執行 **deinit()** 操作。這意味著類可以被反初始化。

  • 類是引用型別。

我們應該何時使用結構體?

Swift 中的結構體在各種情況下都很有用。以下是:

  • 簡單資料型別

    如果您不需要在物件之間建立複雜的關係,則應該使用結構體。這意味著,當您必須在程式碼中傳遞沒有依賴關係的物件時,使用結構體更簡單。

  • 不需要繼承

    我們知道結構體不支援繼承。基於此,您有一個簡單的場景,您應該在程式碼中使用結構體。顯然,當您不需要繼承時,使用結構體更簡單。

  • 執行緒安全

    程式碼中許多內容都在不同的執行緒上執行。當例項被共享並可從多個執行緒訪問時,可能會出現死鎖或競爭條件。在這種情況下,結構體是執行緒安全的。

  • 主要結構化場景

    建立類或結構體的目的是儲存資訊和執行操作。我們大多需要有關值型別的資訊,例如 String、Int、Boolean 等。顯然,結構體在這種情況下最合適。

我們應該何時使用類?

我們知道類有一些結構體沒有的基本特徵:

  • 類可以從另一個類繼承,而結構體則不能。使用類,您可以編寫類 **MyViewController** - **UIViewController** 來建立 UIViewController 的子類。雖然結構體可以實現協議,可以擴充套件,並且可以與泛型一起使用!

  • 類可以 **反初始化**,即可以實現 deinit 函式。此外,您可以對同一個類進行一個或多個引用(即類是引用型別)。

  • 類具有內建的身份概念,因為它們是引用型別。使用身份運算子 ===,您可以檢查兩個引用(變數、常量、屬性等)是否引用同一個物件。

  • 如果要進行 Swift 和 Objective-C 之間的互操作,請使用類。如果需要 Objective-C 互操作性,則需要使用類。例如,如果要在 Realm 資料模型中使用 @objc 和 dynamic,則該模型需要是類。

讓我們透過示例瞭解類和結構體的區別:

示例

class StudentClass {
   var name: String
   var grade: Int
   init(name: String, grade: Int) {
      self.name = name
      self.grade = grade
   }
}
let student1 = StudentClass(name: "Ramesh Chandra", grade: 9)
let student2 = student1
student2.name = "Ramesh Kant"
print("student1 name: \(student1.name)")
print("student2 name: \(student2.name)")

struct StudentStruct {
   var name: String
   var grade: Int
}
let student3 = StudentStruct(name: "Anish Sharma", grade: 8)
var student4 = student3
student4.name = "Anish Gupta"
print("student3 name: \(student3.name)")
print("student4 name: \(student4.name)")

輸出

student1 name: Ramesh Kant
student2 name: Ramesh Kant
student3 name: Anish Sharma
student4 name: Anish Gupta

解釋

在上面的示例中,我們建立了一個名為 **StudentClass** 的類和一個名為 **StudentStruct** 的結構體。現在您需要了解以下幾點:

  • 結構體預設提供初始化器,而類需要我們手動定義。

  • 例項(student1 和 student2)是常量,即使屬性發生更改也不需要是變數。

  • 對於結構體,我們使 student3 為常量,因為不需要更改任何屬性。但是,另一個名為 student4 的物件是變數,因為我們必須更改屬性。

  • 最後,您可以看到輸出。很明顯,類物件共享記憶體位置,這就是為什麼類的另一個例項能夠反映更改的原因。

類和結構體的區別

總結類和結構體的區別

比較 結構體
型別 類是引用型別。 結構體是值型別。
繼承 類具有繼承性,允許一個類繼承另一個類的特性。 結構體不支援繼承。
儲存 類例項儲存在堆上。 結構體屬性儲存在棧上。
初始化器 我們必須手動定義初始化器。 結構體自動獲得預設初始化器。
執行緒安全 類不是完全執行緒安全的。 結構體始終是執行緒安全或單例的。

結論

您瞭解了何時使用類和結構體。基於此,您可以決定打算使用哪一個。

繼承是類和結構體之間最顯著的區別。使用類,您可以清楚地定義子類和父類之間的父子關係。

當您遵循結構體預設方法時,您可以保留以後升級到類的選項。

更新於:2022-12-09

11K+ 瀏覽量

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告