類(class)和結(jié)構(gòu)體(struct)况毅,不止在iOS開發(fā)中辛燥,在其他各種語言開發(fā)中都屬于老生常談的問題了磷瘤,在看class和struct之前敏晤,我們先看一下引用類型和值類型的概念。
引用類型:將一個對象賦值給另一個對象時慕爬,系統(tǒng)不會對此對象進行拷貝窑眯,而會將指向這個對象的指針賦值給另一個對象,當(dāng)修改其中一個對象的值時医窿,另一個對象的值會隨之改變磅甩。
值類型:將一個對象賦值給另一個對象時,會對此對象進行拷貝姥卢,復(fù)制出一份副本給另一個對象卷要,在修改其中一個對象的值時,不影響另外一個對象独榴。
在swift中僧叉,類屬于引用類型,結(jié)構(gòu)體屬于值類型棺榔,相對于其他語言來說瓶堕,swift的結(jié)構(gòu)體功能更加強大,它除了支持在結(jié)構(gòu)體聲明中基礎(chǔ)變量之外症歇,它還支持在結(jié)構(gòu)體中聲明方法郎笆,這相對于其他語言來說谭梗,是swift的一個特性之一。此外宛蚓,除了引用類型和值類型的區(qū)別之外激捏,他們還有其他的不同點,下面總結(jié)一下在swift中類和結(jié)構(gòu)體的不同點:
不同點:1.類屬于引用類型凄吏,結(jié)構(gòu)體屬于值類型
2.類允許被繼承远舅,結(jié)構(gòu)體不允許被繼承
3.類中的每一個成員變量都必須被初始化,否則編譯器會報錯痕钢,而結(jié)構(gòu)體不需要图柏,編譯器會自動幫我們生成init函數(shù),給變量賦一個默認(rèn)值
下面我們通過代碼來看一下盖喷,在swift中類(引用類型)和結(jié)構(gòu)體(值類型)具體表現(xiàn)出有何不同:
首先我們聲明一個ClassTest類爆办,其中聲明了兩個變量number和name
class?ClassTest {
? ? var?number: Int = 0
? ? var?name: String = "test"
}
聲明一個aTest难咕,輸出aTest的值课梳,之后將aTest賦值給bTest,并改變bTest的值余佃,相對應(yīng)的暮刃,aTest的值也會被改變
? ? ? ? letaTest =ClassTest()
? ? ? ? print("number is \(aTest.number)")
? ? ? ? print("name is \(aTest.name)")
? ? ? ? //以上兩行代碼會輸出number is 0和number is test
? ? ? ? letbTest = aTest
? ? ? ? bTest.number=5
? ? ? ? bTest.name="testAAA
? ? ? ? //改變了bTest中的值,由于類是引用類型爆土,相對于的aTest中的值也會被改變
? ? ? ? print("number is \(aTest.number)")
? ? ? ? print("number is \(aTest.name)")
? ? ? ? //此時aTest中的number為5椭懊,name為testAAA
如果我們將類換成結(jié)構(gòu)體,那會是什么情況呢步势?很明顯氧猬,根據(jù)值類型的特性,當(dāng)我們改變b的值時坏瘩,不會影響到a的值盅抚。
structStructTest {
? ? varnumber:Int=1
? ? varname:String="struct"
}
聲明aStruct,打印其中的值為默認(rèn)值倔矾,聲明bStruct妄均,并且將aStruct賦值給bStruct,改變b的值并不會影響a中的值哪自。
? ? ? ? letaStruct =StructTest()
? ? ? ? print(aStruct.number)
? ? ? ? print(aStruct.name)
? ? ? ? //控制臺輸出1和struct
? ? ? ? varbStruct = aStruct
? ? ? ? bStruct.number=10
? ? ? ? bStruct.name="myTestStruct"
? ? ? ? print(bStruct.number)
? ? ? ? print(bStruct.name)
? ? ? ? print(aStruct.number)
? ? ? ? print(aStruct.name)
? ? ? ? //此時輸出bStruct的值丰包,會輸出10和myTestStruct,而aStruct中的值不會被影響壤巷,仍然輸出1和struct
以上關(guān)于類和結(jié)構(gòu)體的異同就講到這里邑彪,感興趣的同學(xué)可以在深究,在swift中胧华,許多新特性相對于其他語言來說更有意思寄症,比如結(jié)構(gòu)體中也可以聲明方法升筏,這意味著我們在使用結(jié)構(gòu)體時,可以更加靈活瘸爽。