美文网首页
Swift designated initializers 问题

Swift designated initializers 问题

作者: craig_wang | 来源:发表于2017-08-31 19:49 被阅读13次

需要主动调用父类 designated initializers

1. 子类designated initializers (有调用自身函数) 代码如下:

class Name: NSObject {
    
    override init() {
        super.init() /// 需要调用父类initializers(任意一个)<编译器无法隐式添加,如果全是属性那直接添加在函数最后,但由于出现了函数调用,那么编译器并不知道是先让父类的构造函数先执行来对属性进行设置还是先调子类函数<函数可以使用父类属性>,这个顺序是会产生不同的执行效果的,所以这里需要开发显示调用>
        self.nameFunc() /// 调用自己的函数
    }
    
    func nameFunc() {}
    
}

2. 父类有init()之外的designated initializers构造函数(就算所有属性都被初始化,同样适用) 代码如下:

class User {
    
    var name: String = ""
    var age: Int = 0

    /// 没有这个构造器,那么子类就可以不调用父类(同时,如果父类有唯一的init(),那么编译器会在子类构造函数中添加对父类init()的调用)
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    init() {
        self.call()
    }

    func call() {
        /// 只有init的话,就算子类没显示调用,该函数也会执行
        print("init called")
    }

}

class Teatcher: User {
    
    var scholl: String

    init(scholl: String) {
        self.scholl = scholl
        super.init() /// 需要明确调用哪一个为父类初始化(任意一个)
    }
    
}

总结就是,当父类有构造函数:

  • 子类一定要调用父类的构造函数
  • 如果编译器不能隐式添加父类的调用,一定要显示添加

相关文章

网友评论

      本文标题:Swift designated initializers 问题

      本文链接:https://www.haomeiwen.com/subject/xxrcjxtx.html