Swift中的類(lèi)class與結(jié)構(gòu)體struct體學(xué)習(xí)筆記
一、引言
Swift中的類(lèi)與結(jié)構(gòu)體十分相似,和Objective-C不同的事,Swift中的結(jié)構(gòu)體不僅可以定義屬性,也可以像類(lèi)一樣為其定義方法。
Swift中的類(lèi)與結(jié)構(gòu)體有如下相似點(diǎn):
1.定義屬性來(lái)存儲(chǔ)值。
2.定義函數(shù)來(lái)提供功能。
3.通過(guò)定義下標(biāo)語(yǔ)法使用下標(biāo)的方式取值。
4.定義構(gòu)造方法來(lái)對(duì)其進(jìn)行初始化。
5.通過(guò)擴(kuò)展來(lái)在原始基礎(chǔ)上添加功能。
6.通過(guò)協(xié)議來(lái)定義實(shí)現(xiàn)標(biāo)準(zhǔn)。
當(dāng)然類(lèi)和結(jié)構(gòu)體也有許多不同點(diǎn),下面這些功能是類(lèi)獨(dú)有的,結(jié)構(gòu)體沒(méi)有:
1.通過(guò)繼承來(lái)創(chuàng)建類(lèi)的子類(lèi)。
2.在運(yùn)行時(shí)允許對(duì)類(lèi)的實(shí)例進(jìn)行類(lèi)型的檢查和解釋。
3.析構(gòu)方法可以釋放被類(lèi)引用的資源。
4.通過(guò)引用計(jì)數(shù)允許一個(gè)類(lèi)實(shí)例的多處引用。
當(dāng)開(kāi)發(fā)者在代碼中傳遞這些實(shí)例時(shí),結(jié)構(gòu)體總是被賦值,而類(lèi)則是被引用。這是結(jié)構(gòu)體和類(lèi)的最本質(zhì)區(qū)別。
二、類(lèi)與結(jié)構(gòu)體的定義
類(lèi)與結(jié)構(gòu)體在定義語(yǔ)法上相似,示例代碼如下:
class MyClass {
var name = "HS"
var age = 25
}
struct MyStruct {
var param1:Int
var param2:String
}
//創(chuàng)建類(lèi)的實(shí)例
var obj1 = MyClass()
//創(chuàng)建結(jié)構(gòu)體的實(shí)例 所有結(jié)構(gòu)體會(huì)默認(rèn)生成一個(gè)逐個(gè)設(shè)置屬性的構(gòu)造方法 而類(lèi)不會(huì)
var obj2 = MyStruct(param1: 1,param2: "1")
//可以通過(guò)點(diǎn)語(yǔ)法來(lái)獲取類(lèi)或者結(jié)構(gòu)體中的屬性值
print(obj1.age,obj2.param1)
通過(guò)示例間的傳遞,可以證明Swift中類(lèi)被引用于結(jié)構(gòu)體被復(fù)制這樣的特點(diǎn),示例如下:
//將類(lèi)實(shí)例傳遞給另一個(gè)變量 var obj3 = obj1 //將結(jié)構(gòu)體實(shí)例傳遞給另一個(gè)變量 var obj4 = obj2 //修改變臉的值 obj3.name = "NewHS" obj4.param1 = 2 //將 打印 NewHS 1 //說(shuō)明類(lèi)是被引用的 結(jié)構(gòu)體則被賦值 print(obj1.name,obj2.param1)
注意:在實(shí)例傳遞時(shí)同樣采用復(fù)制原理的還有枚舉類(lèi)型。
由于類(lèi)是通過(guò)引用來(lái)進(jìn)行傳遞,Swift中還提供了一種運(yùn)算符用來(lái)比較兩個(gè)實(shí)例變量或常量是否指向同一個(gè)引用,示例如下:
if obj1===obj3{
print("same refer")
}else if obj1 !== obj3 {
print("not same refer")
}
實(shí)際上,===與!==運(yùn)算符比較的是指針內(nèi)容。
三、類(lèi)和結(jié)構(gòu)體的選擇
由于類(lèi)和結(jié)構(gòu)體有著不同的傳遞機(jī)制,因此其也適用于不同的開(kāi)發(fā)任務(wù),下面這些情況下,官方推薦開(kāi)發(fā)者使用結(jié)構(gòu)體來(lái)創(chuàng)建數(shù)據(jù)類(lèi)型:
1.該數(shù)據(jù)類(lèi)型封裝少量的簡(jiǎn)單數(shù)據(jù)值。
2.該類(lèi)型數(shù)據(jù)來(lái)傳遞時(shí),應(yīng)該被復(fù)制。
3.該類(lèi)型中定義的數(shù)據(jù)類(lèi)型在傳遞時(shí)也應(yīng)該被賦值。
4.不需要通過(guò)集成另一個(gè)數(shù)據(jù)類(lèi)型而來(lái)。
除了上面列舉的一些情況,其它情況下,都推薦開(kāi)發(fā)者使用類(lèi)來(lái)描述數(shù)據(jù),這也是開(kāi)發(fā)中最后常用的手段。
相關(guān)文章
快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例
快速排序是一種不穩(wěn)定的排序,存在著優(yōu)化空間,這里我們來(lái)看快速排序算法在Swift編程中的幾種代碼實(shí)現(xiàn)示例:2016-07-07
Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPr
這篇文章主要為大家介紹了Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPrecedes用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
switch實(shí)現(xiàn)一個(gè)兩數(shù)的運(yùn)算代碼示例
這篇文章主要介紹了switch實(shí)現(xiàn)一個(gè)兩數(shù)的運(yùn)算代碼示例,需要的朋友可以參考下2017-06-06
swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼
正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。本文重點(diǎn)給大家介紹swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-08-08
Swift設(shè)置UILabel內(nèi)邊距的實(shí)例代碼
有時(shí)候,我們需要一個(gè)顯示文字,又想這些文字與邊界之間有自定義的邊距,所以下面這篇文章主要給大家介紹了關(guān)于Swift設(shè)置UILabel內(nèi)邊距的相關(guān)資料,需要的朋友可以參考下2021-10-10

