本質區別:struct 是值引用(value reference),而 class 是地址引用(class reference)。后面很多差異都是因此導致的。
構造方法
struct 會自動將成員變量自動添加到構造方法中,自動生成帶參構造器。
- 注1:自動生成的帶參構造器會將全部參數加入。
- 注2:如果當中有一個私有屬性,那么就不會自動生成帶參構造器。
class 不會自動生成帶參構造器
等號賦值
struct是值引用類型,那么在使用等號賦值的時候,會將值復制一份出來。class 是地址引用類型,那么在賦值的時候,就會復制地址,也就是一個新的指向原來地址的指針
- 這就會導致class中,新賦值的class對象中成員變量值修改了,舊的class對象中成員變量的值也會被修改。
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 是值引用類型,所以整個對象是一個整體,他實例對象如果是用 let 修飾的,那么無論里面成員變量是用 var 還是 let 修飾 ,其成員變量的值都是不可改變的。
struct Rectangle {
var width = 50
var height = 50
}
//調用
let myRectangle = Rectangle()
//myRectangle.width = 100
//這里如果調用就會報錯,說他是不能改變的
class 是地址引用類型的,即使對象是 let 修飾也是可以修改里面的成員變量
class Rectangle {
var width = 50
var height = 50
}
//調用
let myRectangle = Rectangle()
myRectangle.width = 100
//這里調用就是沒有問題的
繼承
struct無法繼承,class可以繼承
extension 使用
struct 在 extension 中添加方法來修改成員變量的值的時候,需要在方法前加 mutating ,class 則不需要