Swift中的類與結構體十分類似,和Objective-C不一樣的是,Swift中的結構體不只能夠定義屬性,也能夠像類同樣爲其定義方法。函數
Swift中的類與結構體有以下類似點:性能
1.定義屬性來存儲值。優化
2.定義函數來提供功能。this
3.經過定義下標語法使用下標的方式取值。spa
4.定義構造方法來對其進行初始化。指針
5.經過擴展來在原始基礎上添加功能。code
6.經過協議來定義實現標準。orm
固然類和結構體也有許多不一樣點,下面這些功能是類獨有的,結構體沒有:繼承
1.經過繼承來建立類的子類。ip
2.在運行時容許對類的實例進行類型的檢查和解釋。
3.析構方法能夠釋放被類引用的資源。
4.經過引用計數容許一個類實例的多處引用。
當開發者在代碼中傳遞這些實例時,結構體老是被複制,而類則是被引用。這是結構體和類的最本質區別。
類與結構體在定義語法上類似,示例代碼以下:
class MyClass { var name = "HS" var age = 25 } struct MyStruct { var param1:Int var param2:String } //建立類的實例 var obj1 = MyClass() //建立結構體的實例 全部結構體會默認生成一個逐個設置屬性的構造方法 而類不會 var obj2 = MyStruct(param1: 1,param2: "1") //能夠經過點語法來獲取類或者結構體中的屬性值 print(obj1.age,obj2.param1)
經過實例間的傳遞,能夠證實Swift中類被引用於結構體被複制這樣的特色,示例以下:
//將類實例傳遞給另外一個變量 var obj3 = obj1 //將結構體實例傳遞給另外一個變量 var obj4 = obj2 //修改變量的值 obj3.name = "NewHS" obj4.param1 = 2 //將 打印 NewHS 1 //說明類是被引用的 結構體則被賦值 print(obj1.name,obj2.param1)
注意:在實例傳遞時一樣採用複製原理的還有枚舉類型。
因爲類是經過引用來進行傳遞,Swift中還提供了一種運算符用來比較兩個實例變量或常量是否指向同一個引用,示例以下:
if obj1===obj3{ print("same refer") }else if obj1 !== obj3 { print("not same refer") }
實際上,===與!==運算符比較的是指針內容。
因爲類和結構體有着不一樣的傳遞機制,所以其也適用於不一樣的開發任務,下面這些狀況下,官方推薦開發者使用結構體來建立數據類型:
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 管理全部的值拷貝以確保性能最優化,因此你不必去迴避賦值來保證性能最優化。
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592