初始化2

/*
初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程

初始化的主要目的:对内部的存储属性赋值

结构:如果不自己添加初始化,会自动添加默认init和memberwise init

*/
//***********类的初始化*****************/
 

class XX {

}


//会报错,因为没有初始值(存储属性)

//class YY {
// var i:Int
//}


//下面有默认init,因为i有初始值

class MM {
var i: Int = 1
}


//NN没有构造器

class NN {
var i: Int
init(a: Int){
i = a
}
}


//黄金规则1:实例化之后所有的存储属性必须有值(两种方法赋值)

//专门(特定)的初始化器designated initiliazer

//作用:1.给本类的所有存储属性赋值

class AA {
var m:Int
var n:Int
init(mm: Int,nn: Int) {
m = mm
n = nn
}
init() {
m = 111
n = 22


//这里会报错,表明特定的init之间不能相互调用
//所以建议:实际每个类只写一个特定的初始化器

// self.init(mm:111,nn:222)
}



//便利的初始化器需要调用专门的初始化器(直接或间接都可以)

convenience init(mm: Int){

self.init(mm:mm,nn:1)
}

convenience init(nn: Int){
//self.init(mm:1,nn:2)
self.init(mm:nn)
}

}

**************有了继承****

class Parent {
var i:Int = 1
// var m: String? //只有可为nil的类型会有默认值

var m: Int
init(m: Int) {
self.m = m
}
}

class Child :Parent {
var n: Int
init(n: Int) {
//阶段一
self.n = n //先把自己的活干完
super.init(m: 1)//在叫父类干
//阶段二
m = 2//不满意父类的,就自己干

}

}

/**
专门初始化器:
1.可以有多个
2.互相不能调用,每一个负责实现所有本类存储属性的初始化
3.负责处理继承过来的存储属性的初始化。
3.1 相信别人,所以表现就是调用父类的特定初始化器(不能
调用父类的便利初始化器)
便利的初始化器:
1.可以有多个
2.可以调用本来其它的便利初始化器,也可以调用本类的特定初始化器
3.最终一定是调用本类的特定初始化器
*/

//*******初始化器的继承***********

class P{
var m: Int
init(m: Int) {
self.m = m
}
init(m: Int,f: Bool) {
self.m = m
}
convenience init() {
self.init(m: 1)
}

}
class C: P{
var n: Int = 1
override init(m: Int) {
super.init(m: m)
}
override init(m: Int, f: Bool) {
super.init(m: m, f: f)
}

// init(n: Int) {
// self.n = n
// super.init(m: 1)
// }
}


/*默认情况下,子类不会继承父类的构造器
如果想让子类继承父类的构造器,有以下几个条件
1.自己的属性必须已经赋值(声明时)
2.会继承父类的特定初始化器
3.如果子类把父类所有的特定初始化器都实现了,
那么子类也会继承父类的所有便利初始化器


*/

//let ins = C(


//***********可失败的

class FailureClass {
var name:String
init?(name:String) {

self.name = name
if name.isEmpty { return nil}


}
}


//返回的是一个可为nil的类型

let ins = FailureClass(name: "dasf")
ins?.name
if let xx = ins {
xx.name
}
ins!.name
原文地址:https://www.cnblogs.com/kangniuniu/p/4951072.html