類(class)和結(jié)構(gòu)體(struct),不止在iOS開發(fā)中喉酌,在其他各種語言開發(fā)中都屬于老生常談的問題了聊品,在看class和struct之前,我們先看一下引用類型和結(jié)構(gòu)體的概念柄延。
引用類型:將一個對象賦值給另一個對象時,系統(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ù),給變量賦一個默認值
下面我們通過代碼來看一下沽一,在swift中類(引用類型)和結(jié)構(gòu)體(值類型)具體表現(xiàn)出有何不同:
首先我們聲明一個ClassTest類盖溺,其中聲明了兩個變量number和name
class ClassTest {
var number: Int = 0
var name: String = "test"
復(fù)制代碼
}
聲明一個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
復(fù)制代碼
如果我們將類換成結(jié)構(gòu)體遗契,那會是什么情況呢?很明顯病曾,根據(jù)值類型的特性牍蜂,當(dāng)我們改變b的值時,不會影響到a的值泰涂。
structStructTest {
varnumber:Int=1
varname:String="struct"
復(fù)制代碼
}
聲明aStruct鲫竞,打印其中的值為默認值,聲明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