Swift 中荣倾,類是引用類型,結(jié)構(gòu)體是值類型骑丸。值類型在傳遞和賦值時(shí)將進(jìn)行復(fù)制舌仍,而引用類型則只會(huì)使用引用對(duì)象的一個(gè)"指向"妒貌。所以他們兩者之間的區(qū)別就是兩個(gè)類型的區(qū)別。
舉個(gè)簡(jiǎn)單的例子铸豁,代碼如下
class Temperature {
var value: Float = 37.0
}
class Person {
var temp: Temperature?
func sick() {
temp?.value = 41.0
}
}
let A = Person()
let B = Person()
let temp = Temperature()
A.temp = temp
B.temp = temp
A.sick()
上面這段代碼灌曙,由于 Temperature 是 class ,為引用類型节芥,故 A 的 temp 和 B 的 temp指向同一個(gè)對(duì)象在刺。A 的 temp修改了,B 的 temp 也隨之修改头镊。這樣 A 和 B 的 temp 的值都被改成了41.0蚣驼。如果將 Temperature 改為 struct,為值類型相艇,則 A 的 temp 修改不影響 B 的 temp颖杏。
內(nèi)存中,引用類型諸如類是在堆(heap)上坛芽,而值類型諸如結(jié)構(gòu)體實(shí)在棧(stack)上進(jìn)行存儲(chǔ)和操作输玷。相比于棧上的操作,堆上的操作更加復(fù)雜耗時(shí)靡馁,所以蘋果官方推薦使用結(jié)構(gòu)體,這樣可以提高 App 運(yùn)行的效率机久。
class有這幾個(gè)功能struct沒有的:
class可以繼承臭墨,這樣子類可以使用父類的特性和方法
類型轉(zhuǎn)換可以在runtime的時(shí)候檢查和解釋一個(gè)實(shí)例的類型
可以用deinit來釋放資源
一個(gè)類可以被多次引用
struct也有這樣幾個(gè)優(yōu)勢(shì):
結(jié)構(gòu)較小,適用于復(fù)制操作膘盖,相比于一個(gè)class的實(shí)例被多次引用更加安全胧弛。
無須擔(dān)心內(nèi)存memory leak或者多線程沖突問題