swift 的构造和析构函数
一、构造函数使用init(params) {} 的方式
1、当新建一个类的时候,会调用init构造函数,如果类中无init构造函数时候会调用默认的init(){} 构造函数
2、当子类继承父类的时候,子类在init的时候可调用父类的init,通过super.init(params)。如果子类中有let声明的属性时候则需要在init调用开始的时候优先初始化这些let属性
3、因为init可对父类的init 重写(使用override标识符),那么类中可否两个init进行调用呢?也是可以的(使用convenience标识符)
class SuperCon { init(name: String) { print("SuperCon", name) } deinit { // 析构的时候先调用父类的析构函数再调用子类的析构函数 print("supercon deinit") } } class SubCon: SuperCon { let temp: String? override init(name: String) { // 因为父类也有init(name: String) 所以需要使用override修饰 temp = nil super.init(name: name) print("SubCon", name) } init(key: Int) { temp = "kkqqq" // 因为temp是let,所以需要在调用父类之前就调用 super.init(name: "key") print(key, "sdf") } convenience init() { // 调用本类中的其他init方法,则需要convenience进行修饰 self.init(key: 1) print("conven") } deinit { print("subcon deinit") } }
总结:
1、convenience是调用同类中的其他init,并且调用同类中的最后一个init一定不能是由convenience修饰
2、当本类的所有必须初始化的属性未初始化完毕时,不能将self作为参数在init中进行其他的操作
3、let修饰的属性必须在非convenience修饰的init的最开始位置进行初始化