Swift中的類與結構體十分相似,和Objective-C不同的是,Swift中的結構體不僅可以定義屬性,也可以像類一樣為其定義方法。
Swift中的類與結構體有如下相似點:
1.定義屬性來存儲值。
2.定義函數來提供功能。
3.通過定義下智語法使用下标的方式取值。
4.定義構造方法來對其進行初始化。
5.通過擴充來在原始基礎上添加功能。
6.通過協定來定義實作标準。
當然類和結構體也有許多不同點,下面這些功能是類獨有的,結構體沒有:
1.通過繼承來建立類的子類。
2.在運作時允許對類的執行個體進行類型的檢查和解釋。
3.析構方法可以釋放被類引用的資源。
4.通過引用計數允許一個類執行個體的多處引用。
當開發者在代碼中傳遞這些執行個體時,結構體總是被複制,而類則是被引用。這是結構體和類的最本質差別。
類與結構體在定義文法上相似,示例代碼如下:
通過執行個體間的傳遞,可以證明Swift中類被引用于結構體被複制這樣的特點,示例如下:
注意:在執行個體傳遞時同樣采用複制原理的還有枚舉類型。
由于類是通過引用來進行傳遞,Swift中還提供了一種運算符用來比較兩個執行個體變量或常量是否指向同一個引用,示例如下:
實際上,===與!==運算符比較的是指針内容。
由于類和結構體有着不同的傳遞機制,是以其也适用于不同的開發任務,下面這些情況下,官方推薦開發者使用結構體來建立資料類型:
1.該資料類型封裝少量的簡單資料值。
2.該類型資料來傳遞時,應該被複制。
3.該類型中定義的資料類型在傳遞時也應該被指派。
4.不需要通過繼承另一個資料類型而來。
除了上面列舉的一些情況,其它情況下,都推薦開發者使用類來描述資料,這也是開發中最後常用的手段。
擴充:在Swift中,Array,String,Dictionary這些類型都是采用的結構體的方式來實作,并不是采用引用的方式,NSString,NSArray,NSDictionary這些Objective-C的類是采用引用的方式實作的,是以在Swift中,String,Array,Dictionary在傳遞時總是被指派。然而官方文檔中還有一句話十分有意思:
The description above refers to the “copying” of strings, arrays, and dictionaries. The behavior you see in your code will always be as if a copy took place. However, Swift only performs an actual copy behind the scenes when it is absolutely necessary to do so. Swift manages all value copying to ensure optimal performance, and you should not avoid assignment to try to preempt this optimization.
大緻意思是,在你的代碼中,拷貝行為看起來似乎總會發生。然而,Swift 在幕後隻在絕對必要時才執行實際的拷貝。Swift 管理所有的值拷貝以確定性能最優化,是以你沒必要去回避指派來保證性能最優化。