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 的物件是變數,因為我們必須更改屬性。
最後,您可以看到輸出。很明顯,類物件共享記憶體位置,這就是為什麼類的另一個例項能夠反映更改的原因。
類和結構體的區別
總結類和結構體的區別
比較 | 類 | 結構體 |
---|---|---|
型別 | 類是引用型別。 | 結構體是值型別。 |
繼承 | 類具有繼承性,允許一個類繼承另一個類的特性。 | 結構體不支援繼承。 |
儲存 | 類例項儲存在堆上。 | 結構體屬性儲存在棧上。 |
初始化器 | 我們必須手動定義初始化器。 | 結構體自動獲得預設初始化器。 |
執行緒安全 | 類不是完全執行緒安全的。 | 結構體始終是執行緒安全或單例的。 |
結論
您瞭解了何時使用類和結構體。基於此,您可以決定打算使用哪一個。
繼承是類和結構體之間最顯著的區別。使用類,您可以清楚地定義子類和父類之間的父子關係。
當您遵循結構體預設方法時,您可以保留以後升級到類的選項。