struct比class更“輕量級”(struct更快绝编,class可以承載更多的東西)
就區(qū)別來說:
1迫卢、struct會自動生成需要的構造方法(constructor)扁誓,哪個屬性沒有賦初始值就會生成以哪個屬性為參數(shù)的構造方法。而class沒有尿瞭,要自己寫
// 結構體(值類型)
struct Resolution {
var width = 0
var height = 0
}
let _:Resolution = Resolution(width: 1, height: 3)//結構體類型的成員逐一構造器
// 類(引用類型)
class VideoMode {
var resolution = Resolution()
var name: String?
}
let someVideoMode:VideoMode = VideoMode()
2闽烙、struct的屬性可以不賦初始值,而class的屬性必須賦初始值或者設為可選類型
// 結構體(屬性可以不賦初始值)
struct Resolution {
var width:Int
var height:Int
}
let _:Resolution = Resolution(width: 1, height: 3)
// 類(引用類型)
class VideoMode {
// 屬性必須賦初始值,或者設為可選類型
var resolution = Resolution(width: 1, height: 2)
var name: String?
}
如果類沒有賦初始值或者設為可選類型声搁,那么就會報錯cannot be constructed because it has no accessible initializers
3.struct是值類型(Value Type)分配在棧中,是深拷貝黑竞。class是引用類型(Reference Type)配在堆中,淺拷貝疏旨。
因為struct是值類型放在棧中很魂,那么也就是說struct的釋放不歸自動引用計數(shù)器管
//結構體(值類型),深拷貝
var struct1 = Resolution(width: 1, height: 1)
var struct2 = struct1
struct2.width = 2
print("struct1 = \(struct1)") // 打印結果:struct1 = Resolution(width: 1, height: 1)
//類(引用類型)檐涝,淺拷貝
var class1 = VideoMode.init()
class1.name = "class1"
var class2 = class1
class2.name = "class2"
print("class1 = \(class1.name)") // 打印結果:class1 = Optional("class2")
4遏匆、不可變實例的不同
let class3 = VideoMode.init()
class3.name = "class3" //可以修改
let struct3 = Resolution(width: 2, height: 4)
struct3.height = 4 //報錯 Cannot assign to property: 'struct3' is a 'let' constant
5、在實例方法中修改值類型骤铃,struct需要在方法前加上mutating
// 結構體(值類型)
struct Resolution {
var width = 0
var height = 0
mutating func changeWidth(width: Int) {
self.width = width
}
}
// 類(引用類型)
class VideoMode {
// class的屬性必須賦初始值或者設為可選類型
var resolution = Resolution()
var name: String?
func changeName(name: String) {
self.name = name
}
}