本質(zhì)區(qū)別:struct 是值引用(value reference)嘹悼,而 class 是地址引用(class reference)哨啃。后面很多差異都是因此導(dǎo)致的割粮。
構(gòu)造方法
struct 會(huì)自動(dòng)將成員變量自動(dòng)添加到構(gòu)造方法中争便,自動(dòng)生成帶參構(gòu)造器。
- 注1:自動(dòng)生成的帶參構(gòu)造器會(huì)將全部參數(shù)加入完疫。
- 注2:如果當(dāng)中有一個(gè)私有屬性泰鸡,那么就不會(huì)自動(dòng)生成帶參構(gòu)造器。
class 不會(huì)自動(dòng)生成帶參構(gòu)造器
等號(hào)賦值
struct是值引用類型壳鹤,那么在使用等號(hào)賦值的時(shí)候盛龄,會(huì)將值復(fù)制一份出來。class 是地址引用類型芳誓,那么在賦值的時(shí)候余舶,就會(huì)復(fù)制地址,也就是一個(gè)新的指向原來地址的指針
- 這就會(huì)導(dǎo)致class中锹淌,新賦值的class對(duì)象中成員變量值修改了匿值,舊的class對(duì)象中成員變量的值也會(huì)被修改。
struct SRectangle {
var width = 50
var height = 50
}
class CRectangle {
var width = 50
var height = 50
}
var sOld = SRectangle()
var sNew = sOld
sOld.width = 100
//這里 sNew.width 值是 50 不受影響
var cOld = CRectangle()
var cNew = cOld
cOld.width = 100
//這里 cNew.width 值也變成了 100
成員變量
struct 是值引用類型赂摆,所以整個(gè)對(duì)象是一個(gè)整體挟憔,他實(shí)例對(duì)象如果是用 let 修飾的,那么無論里面成員變量是用 var 還是 let 修飾 烟号,其成員變量的值都是不可改變的绊谭。
struct Rectangle {
var width = 50
var height = 50
}
//調(diào)用
let myRectangle = Rectangle()
//myRectangle.width = 100
//這里如果調(diào)用就會(huì)報(bào)錯(cuò),說他是不能改變的
class 是地址引用類型的褥符,即使對(duì)象是 let 修飾也是可以修改里面的成員變量
class Rectangle {
var width = 50
var height = 50
}
//調(diào)用
let myRectangle = Rectangle()
myRectangle.width = 100
//這里調(diào)用就是沒有問題的
繼承
struct無法繼承龙誊,class可以繼承
extension 使用
struct 在 extension 中添加方法來修改成員變量的值的時(shí)候,需要在方法前加 mutating 喷楣,class 則不需要