iOS Swift 中Class 和 Struct 的區(qū)別
在Swift中,Apple是大力提倡結(jié)構(gòu)體的,很多基本的單元都變成了結(jié)構(gòu)體椎木。
比如Int,在OC中是基本數(shù)值類型,在Swift中變成了結(jié)構(gòu)體轩性。
OC中的基本數(shù)據(jù)類型NSInteger與Swift中的Int結(jié)構(gòu)體
1.結(jié)構(gòu)體是值類型毁兆,類是引用類型
Struct is value type while class is reference type
struct SRound {
var radius:Int?
}
let sr1 = SRound(radius: 2)
var sr2 = SRound()
sr2.radius = 4
print("sr1.radius is \(sr1.radius!)\nsr2.radius is \(sr2.radius!)\n")
var sr3 = sr2
sr2.radius = 100
print("sr2.radius is \(sr2.radius!)\nsr3.radius is \(sr3.radius!) ")
輸出結(jié)果為
sr1.radius is 2
sr2.radius is 4
sr2.radius is 100
sr3.radius is 4
將值類型(Value Type)賦值給新的變量時往踢,是值傳遞的泼差,也就是copy一份給了新變量构诚。
上例中蚌斩,sr2結(jié)構(gòu)體中,在sr2賦值給sr3時范嘱,sr2.radius 是4送膳,sr3是一份全新的跟sr2一樣的struct。
當sr2被改變時丑蛤,并不能印象sr3叠聋。這也是值傳遞的本質(zhì)。
相反地盏阶,class在賦值的時候則是引用傳遞(類似OC中指針傳遞)晒奕。
2.Struct(結(jié)構(gòu)體)沒有繼承特性
Struct(結(jié)構(gòu)體)沒有繼承特性
3.Class需要自己構(gòu)建constructor
struct SRound {
var radius:Int?
var width:Int
}
let sr1 = SRound(radius: 2, width: 2) //自動生成的contructor
class CRound {
var radius:Int?
init(radius:Int?) { //自己構(gòu)建的constructor
self.radius = radius
}
}
let cr1 = CRound(radius: 3)
當Struct中有成員不是可選型,該結(jié)構(gòu)體的構(gòu)建方法就必須包括所有成員參數(shù)及全員構(gòu)造器名斟,該構(gòu)造器是默認生成的脑慧,只有所有成員都為可選型,可直接簡單構(gòu)造砰盐,如下:
struct SRound {
var radius:Int?
var width:Int
}
let sr1 = SRound(radius: 2, width: 2)
struct SRound2 {
var radius:Int?
var width:Int?
}
var sr2 = SRound2()
sr2.radius = 1
4.Struct改變內(nèi)容受修飾符let影響闷袒,Class不受影響
let修飾的struct無法被改變,遵循變量修飾符let的通常用法岩梳,但let的此效果無法作用到class上
let對struct和class的影響
5.Struct方法的mutating修飾符
當struct方法中需要修改自身property時囊骤,方法需要前綴修飾符 mutating
stuct的mutating修飾符
修正如下:
struct SRound {
var radius:Int?
var width:Int
}
extension SRound {
mutating func changeRadius(radius:Int) {
self.radius = radius
}
}
class CRound {
var radius:Int?
init(radius:Int?) {
self.radius = radius
}
}
extension CRound {
func changeRadius(radius:Int) {
self.radius = radius
}
}
END