一、引言
Swift中的類與結(jié)構(gòu)體十分相似,和Objective-C不同的事,Swift中的結(jié)構(gòu)體不僅可以定義屬性,也可以像類一樣為其定義方法。
Swift中的類與結(jié)構(gòu)體有如下相似點:
1.定義屬性來存儲值。
2.定義函數(shù)來提供功能。
3.通過定義下標(biāo)語法使用下標(biāo)的方式取值。
4.定義構(gòu)造方法來對其進(jìn)行初始化。
5.通過擴(kuò)展來在原始基礎(chǔ)上添加功能。
6.通過協(xié)議來定義實現(xiàn)標(biāo)準(zhǔn)。
當(dāng)然類和結(jié)構(gòu)體也有許多不同點,下面這些功能是類獨有的,結(jié)構(gòu)體沒有:
1.通過繼承來創(chuàng)建類的子類。
2.在運行時允許對類的實例進(jìn)行類型的檢查和解釋。
3.析構(gòu)方法可以釋放被類引用的資源。
4.通過引用計數(shù)允許一個類實例的多處引用。
當(dāng)開發(fā)者在代碼中傳遞這些實例時,結(jié)構(gòu)體總是被賦值,而類則是被引用。這是結(jié)構(gòu)體和類的最本質(zhì)區(qū)別。
二、類與結(jié)構(gòu)體的定義
類與結(jié)構(gòu)體在定義語法上相似,示例代碼如下:
class MyClass { var name = "HS" var age = 25}struct MyStruct { var param1:Int var param2:String}//創(chuàng)建類的實例var obj1 = MyClass()//創(chuàng)建結(jié)構(gòu)體的實例 所有結(jié)構(gòu)體會默認(rèn)生成一個逐個設(shè)置屬性的構(gòu)造方法 而類不會var obj2 = MyStruct(param1: 1,param2: "1")//可以通過點語法來獲取類或者結(jié)構(gòu)體中的屬性值print(obj1.age,obj2.param1)
通過示例間的傳遞,可以證明Swift中類被引用于結(jié)構(gòu)體被復(fù)制這樣的特點,示例如下:
//將類實例傳遞給另一個變量var obj3 = obj1//將結(jié)構(gòu)體實例傳遞給另一個變量var obj4 = obj2//修改變臉的值obj3.name = "NewHS"obj4.param1 = 2//將 打印 NewHS 1 //說明類是被引用的 結(jié)構(gòu)體則被賦值print(obj1.name,obj2.param1)
注意:在實例傳遞時同樣采用復(fù)制原理的還有枚舉類型。
由于類是通過引用來進(jìn)行傳遞,Swift中還提供了一種運算符用來比較兩個實例變量或常量是否指向同一個引用,示例如下:
if obj1===obj3{ print("same refer")}else if obj1 !== obj3 { print("not same refer")}
實際上,===與!==運算符比較的是指針內(nèi)容。
三、類和結(jié)構(gòu)體的選擇
由于類和結(jié)構(gòu)體有著不同的傳遞機(jī)制,因此其也適用于不同的開發(fā)任務(wù),下面這些情況下,官方推薦開發(fā)者使用結(jié)構(gòu)體來創(chuàng)建數(shù)據(jù)類型:
1.該數(shù)據(jù)類型封裝少量的簡單數(shù)據(jù)值。
2.該類型數(shù)據(jù)來傳遞時,應(yīng)該被復(fù)制。
3.該類型中定義的數(shù)據(jù)類型在傳遞時也應(yīng)該被賦值。
4.不需要通過集成另一個數(shù)據(jù)類型而來。
除了上面列舉的一些情況,其它情況下,都推薦開發(fā)者使用類來描述數(shù)據(jù),這也是開發(fā)中最后常用的手段。
新聞熱點
疑難解答
圖片精選