绝对重要,你要是想在ios开发走的更远的话,这个很重要。
//初始化:类型 (枚举,结构,类)的实例在构建过程中的一系列过程
//初始化的主要目的:对内部的储存属性赋值
//***************类的初始化话****************
//没有存储属性,默认会有init
class XX {
}
//代码会报错,没有init,没有给i赋值
//class YY {
// var i:String
//}
//没有赋值,但是有init方法,所以不报错
class MM {
var i: String
init(i: String){
self.i = i
}
}
//综上所述,总结出一条黄金法则:实例化之后的所有存储属性必须有值。
//两种方法给其赋值:
//1.var i: String
//2.init(i: String) { self.i = i}
class AA {
var i: String
var f: Int
//专门初始化器1
init(i: String,f: Int) {
self.i = i
self.f = f
}
//专门初始化器2
init() {
i = "chenhe"
f = 21
// self.init(i:"chenhe",f:21) 这里会报错,表明专门的初始化器不能相互调用。建议:每个类只写一个专门初始化器
}
//便利初始化器需要调用专门的初始化器(直接或者间接)。便利初始化器可以相互调用
//便利初始化器1
convenience init(i: String) {
self.init(i:i,f:21)
}
//便利初始化器1
convenience init(f: Int) {
// self.init(i:"chenhe",f:f)
self.init(f:f)
}
}
//***************类继承*************************
class Person {
// var i: Int = 1
// var m: String? //只有可为nil的类型会有默认值
var m: String
//专门初始化方法
init(m: String) {
self.m = m
}
}
class Child:Person {
var n: String
init(n: String) {
//阶段一
self.n = n //本类先干好自己的事情,初始化自己的存储属性
super.init(m: "chenhe")//再父类干自己的事情,初始化化父类的存储属性
//阶段二
m = "chenxuan" //不满意父类初始化的存储属性值,自己再赋值
}
}
//综上所诉总结一下
/*初始化器init分为两种:专门初始化器,和便利初始化器
专门初始化器
1.可以定义多个
2.互相不能调用,每一个负责实现本类的存储属性初始化
3.身为子类负责处理继承过来的存储属性初始化
3.1 相信别人,调用父类的专门初始化方法来初始化父类的存储属性,但是不能调用父类的便利初始化方法
便利初始化器
1.可以定义多个
2.可以调用本类其它的便利初始化方法,也可以调用本类专门初始化方法,但是最终肯定是要调用专门的初始化器方法
*/
//*****************初始化器的继承*******************
class P {
var m: Int = 12
var l: Int = 13
//专门初始化方法
required init(m: Int,l: Int) {
self.m = m
self.l = l
}
// init() {
// m = 12
// l = 13
// }
//便利初始化方法
convenience init(m: Int) {
self.init(m:m)
}
}
class C:P {
var n: Int = 1
var b: Int = 2
init(n: Int,b: Int) {
self.n = n
self.b = b
super.init(m: 12, l: 13)
}
required init(m: Int, l: Int) {
super.init(m: m, l: l)
}
}
var c = C(m: 23)
/*
综上所诉总结一下
//子类的任何类型的init都不能调用父类的便利init
//required定义的初始化方法必须在父类实现,同时,不要用override声明了,用required声明
//专门初始化方法不不能调用便利器方法
默认情况下,子类是不会继承父类的init初始化方法的
只有满足的以下条件才会:
子类的自己的属性声明时必须赋值
1.会继承父类的专门初始化器
2.如果子类把父类的所有专门初始化器方法在子类里实现了,那么子类在实例时也会继承父类的所有便利器方法
3.可以在子类的专门初始化方法里调用父类的便利方法和专门初始化方法
*/
//******************可失败的初始化器*****************
class Car {
var name: String
init?(name: String) {
self.name = name //Swift机问题,这个必须是在前面
if name.isEmpty {
return nil
}
}
}
//返回的时一个可为nil类型的String
var c1 = Car(name: "chenhe")
c1?.name
c1!.name