Swift 中類和結構體有不少共同點。共同處在於:數組
與結構體對比類還有以下的附加功能:數據結構
注意:結構體老是經過被複制的方式在代碼中傳遞,不適用引用計數。這是類和結構體的區別之一函數
類和結構體均可以使用點語法訪問其屬性。性能
注意:與Objective-C不一樣,Swift容許直接設置結構體的子屬性的值。好比在OC中 tableView.frame.origin.x = 200這種寫法就會報語法錯誤,而在Swift中則不會。優化
結構體都一個自動生成的成員逐一構造器,用於初始化結構體實例中的屬性。如:spa
CGRect.init(origin: , size: ) 然而類卻不會自動生成。.net
值類型被賦予一個變量,常量或者當作參數傳遞給函數的時候,其值會被拷貝。設計
在 Swift 中,全部的基本類型:整數(Integer)、浮 點數(floating-point)、布爾值(Boolean)、字符串(string)、數組(array)和字典(dictionary),都是 值類型,而且在底層都是以結構體的形式所實現。一樣全部的結構體和枚舉類型都是值類型。這意味着它們的實例,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被複制。blog
與值類型不一樣,引用類型在被賦予到一個變量 ,常量或者當作參數傳遞的時候,他的值 不會被拷貝。引用的是已存在的實例自己。繼承
由於類是引用類型,有可能有多個常量或者變量同時引用了一個實例。(對於值類型來講,不會出現這種問題,由於他們的值在用到時老是拷貝一份),有時會有需求判斷兩個變量或者常量是否引用了同一個實例。爲此 Swift內建了兩個恆等運算符:
這兩個運算符用來檢測兩個常量或者變量是否引用同一個實例。
注意: 「等價於」(用三個等號表示, === )與「等於」(用兩個等號表示, == )的不一樣:
1.「等價於」表示兩個類類型(class type)的常量或者變量引用同一個類實例。
2.「等於」表示兩個實例的值「相等」或「相同」,斷定時要遵守設計者定義的評判標準,所以相對於「相 等」來講,這是一種更加合適的叫法。
結構體和類均可以定義數據類型。結構體的實例老是經過值傳遞,而類的實例老是經過引用傳遞。這代表二者的使用場景不一樣。當咱們須要構建項目中的一個數據結構或者功能的時候,須要決定是使用結構體仍是類。
通常狀況下,符合如下一條或者幾條的時候能夠考慮使用結構體:
舉例來講一下狀況適合使用結構體:
1.幾何圖形的大小,封裝一個width和height屬性,二者類型均爲CGFloat。
2.三維座標系一點,封裝x,y,z屬性,三者均爲Double類型。
在其餘的案例中,定義一個類,生成一個他的實例,並經過引用來傳遞。實際中這意味着絕大部分的數據結構都因該是類,而不是結構體。
Swift 中,許多基本類型,諸如 String , Array 和 Dictionary 類型均以結構體的形式實現。這意味着被賦值給 新的常量或變量,或者被傳入函數或方法中時,它們的值會被拷貝。
OC 中 NSString , NSArray 和 NSDictionary 類型均以類的形式實現,而並不是結構體。它們在被賦值或 者被傳入函數或方法時,不會發生值拷貝(除非你主動拷貝一份),而是傳遞現有實例的引用。
注意:以上是對字符串、數組、字典的「拷貝」行爲的描述。在你的代碼中,拷貝行爲看起來彷佛總會發生。然而,Swift 在幕後只在絕對必要時才執行實際的拷貝。Swift 管理全部的值拷貝以確保性能最優化,因此你不必去迴避賦值來保證性能最優化。
--------
以上參考Swift官方教程