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的最开始位置进行初始化

posted @ 2022-04-22 23:14  LCAC  阅读(131)  评论(0编辑  收藏  举报