Swift 中,類是引用類型,結(jié)構(gòu)體是值類型。值類型在傳遞和賦值時將進行復(fù)制,而引用類型則只會使用引用對象的一個"指向"。所以他們兩者之間的區(qū)別就是兩個類型的區(qū)別。
舉個簡單的例子,代碼如下
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指向同一個對象。A 的 temp修改了,B 的 temp 也隨之修改。這樣 A 和 B 的 temp 的值都被改成了41.0。如果將 Temperature 改為 struct,為值類型,則 A 的 temp 修改不影響 B 的 temp。
內(nèi)存中,引用類型諸如類是在堆(heap)上,而值類型諸如結(jié)構(gòu)體實在棧(stack)上進行存儲和操作。相比于棧上的操作,堆上的操作更加復(fù)雜耗時,所以蘋果官方推薦使用結(jié)構(gòu)體,這樣可以提高 App 運行的效率。
class有這幾個功能struct沒有的:
class可以繼承,這樣子類可以使用父類的特性和方法
類型轉(zhuǎn)換可以在runtime的時候檢查和解釋一個實例的類型
可以用deinit來釋放資源
一個類可以被多次引用
struct也有這樣幾個優(yōu)勢:
結(jié)構(gòu)較小,適用于復(fù)制操作,相比于一個class的實例被多次引用更加安全。
無須擔(dān)心內(nèi)存memory leak或者多線程沖突問題