Swift designated initializers 问题

需要主动调用父类 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() /// 需要明确调用哪一个为父类初始化(任意一个)
    }
    
}

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

  • 子类一定要调用父类的构造函数
  • 如果编译器不能隐式添加父类的调用,一定要显示添加
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本章将会介绍 存储属性的初始赋值自定义构造过程默认构造器值类型的构造器代理类的继承和构造过程可失败构造器必要构造器...
    寒桥阅读 781评论 0 0
  • 简介 *自定义构造过程 *默认构造器 *值类型的构造器代理 *类的继承和构造过程 *可失败构造器 *必需构造器 *...
    FishSha阅读 281评论 0 0
  • 1.数字类型倒置 方法1:传统的方法 方法2:可以把数字当成字符串,调用函数传参时,以字符串形式传document...
    yamei_wu阅读 1,433评论 0 0
  • 小珠就像小的快乐和幸福,幸福和快乐积累的多了就成了很大的幸福快乐,这样就拥有了吸引力量,会吸引更多的幸福快乐。
    希波克林阅读 260评论 2 5
  • 又一年的中秋节要来了,老奶奶洗了杯子,洗干净了被铺,洗刷了地板,屋子里里外外都搞卫生,一尘不染。因为儿子和女儿都打...
    林一林阅读 163评论 0 0