Swift - 类、初始化器
2022-03-16 本文已影响0人
aven_kang
class和struct的区别
1.结构体是值类型,不能继承
2.类是引用类型,可以继承
3.类可以重写方法以及属性,结构体不行,因为不存在继承
4.类有多态,结构体没有
5.生成一个类,跟生成一个结构体,从汇编语言来看,类需要生成很多的汇编语言,而结构体则很少,从效率上来讲,简单的可以用结构体,效率更高
结构体、类、枚举都有初始化器
枚举一般不定义初始化器
class Point {
var x:Int
init() {
x = 10
}
}
var p = Point(x:10)
便捷初始化器 - convenience
class Size {
var width:Int
var height:Int
init(width:Int,height:Int){
self.width = width;
self.height = height;
// do something more
}
convenience init(width:Int) {
self.init(width: width, height: 0)
}
}
在上述代码中,我们可以看到有两个初始化器,其中第一个,是我们主要的初始化器,里面可能初始化了很多的属性或其他的东西,在第二个初始化器中,主要是为了给开发者更多的入口,不必强制使用我们的指定初始化器,但是为了确保安全,因为可能有很多的属性需要初始化,而在第二个初始化器中,并未提供height的入口,所以我们需要在第二个初始化器中,调用第一个指定初始化器,确保属性都是初始化了,这种就是便捷初始化器,其初衷是为了安全,第二方面是为了提供更多的入口。

指定初始化器必须从它的父类调用指定初始化器
class Size {
var width:Int
var height:Int
init(width:Int,height:Int){
self.width = width;
self.height = height;
}
convenience init(width:Int) {
self.init(width: width, height: 0)
}
}
class subSize:Size {
var score:Int
init(score:Int){
self.score = score
super.init(width: 0, height: 0)
}
}
在上述代码中,subSize继承Size,在写指定初始化器的时候,如果光写
init(score:Int){
self.score = score
}
这个指定初始化器,会报错,因为继承自Size,需要初始化父类的指定初始化器,还有一个要点,score的初始化,需要放在父类的初始化前面
class subSize:Size {
var score:Int
init(score:Int){
self.score = score
super.init(width: 0, height: 0)
}
}
先确保本类的属性得到初始化,再保证父类的初始化完毕
初始化器的相互调用

class Size {
var width:Int
var height:Int
init(width:Int,height:Int){
self.width = width;
self.height = height;
}
convenience init(width:Int) {
self.init(width: width, height: 0)
}
}
class subSize:Size {
var score:Int = 0
// init(score:Int){
// self.score = score
// super.init(width: 0, height: 0)
// }
}
如果子类没有初始化器,那么在创建subSize这个对象的时候,是需要调用父类的初始化器初始化成员属性,否则会报错
var subSizes = subSize(width: 0, height: 0)