結(jié)構(gòu)體是值類型西疤,類是引用類型(值類型賦值就是copy一份项戴,而引用類型賦值是不同的名字指向同一個內(nèi)存空間)
結(jié)構(gòu)體可以不寫init方法寿桨,系統(tǒng)會默認有一個布轿,類中棱烂,如果不賦初值慕的,就必須要自己寫一個init方法
class Person {
var name:String
var age:Int
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
如果賦了初值燥滑,就可以肆良,可以不寫init纺弊,初始化也可以這樣
let p2 = Person()
在結(jié)構(gòu)體中牛欢,如果屬性是var,但是實例出來的是let淆游,那么傍睹,還是不能修改var屬性的值,例子
struct text {
var name:String
var age:Int
}
let textOne = text(name: "ref", age: 12)
textOne.age = 13//這里是錯誤的犹菱,雖然age是var拾稳,但是textOne是let,就不能修改腊脱,如果textOne是var访得,就可以修改
類中情況就不一樣
let p1 = Person(name: "ref", age: 14)
p1.age = 16//這里p1是let,但是也可以修改age的值
原因就是類是引用類型,其實這里的p1悍抑,是一個指針鳄炉,指向一塊內(nèi)存空間,這里的let是限制了p1這個指針不能指向別的空間搜骡,而不是限制這塊空間內(nèi)的東西拂盯,所以是可以修改的
結(jié)構(gòu)體是值類型,let限制的是這塊內(nèi)存的東西记靡,當然就是不能修改的
再來看一個例子
class Person {
var name:String
var age:Int
init(name:String, age:Int) {
self.name = name
self.age = age
}
func changeName(newName:String){
self.name = newName
}
}
struct text {
var name:String
var age:Int
mutating func changeName(nameone:String) -> () {
self.name = nameone
}
}
注意這里changeName方法谈竿,結(jié)構(gòu)體內(nèi),如果想自己改變自己摸吠,就要加上mutating這個關(guān)鍵字空凸,如果沒有這個關(guān)鍵字,就會報錯蜕便,原因還是兩種類型的不同劫恒。
類可以繼承贩幻,而結(jié)構(gòu)體不能繼承轿腺,這也是一個重要不同。