Swift 十二:构造方法深入分析篇

1).类的指定构造方法和便利构造方法

class MyClass {
    
    var a = 0
    
    var b = 0
    
    init(a : Int , b : Int) {     //指定构造方法
        
        self.a = a
        
        self.b = b
    }
    
    convenience init(a : Int) {
        
        self.init(a: a , b : 0)   //调用指定构造方法
        
    }
    
    convenience init(b : Int) {   //调用其他便利构造方法 
        
        self.init(a:10)
    }
}

指定构造(Designated Initializer)方法中,不允许出现构造器代理self.init(...)

便利构造(Convenience Initializer)方法中,一定是通过调用其他的指定构造方法或者便利构造方法来实现初始化的。

(类似于枚举或者结构体中的构造器代理)


2).派生类的构造方法

class SubClass: MyClass {  //继承自上面的MyClass
    
    var c = 10
    
    init(c : Int) {
        
        self.c = c                //《2》
        
        super.init(a: 10, b: 10)  //《1》
    }
}

《1》构造方法默认是不会被继承的,基类的存储属性只能通过基类的构造方法来初始化

《2》派生类引入的存储属性要先被初始化,然后再调用父类的构造方法对父类的属性进行初始化

《3》只能通过调用父类的指定构造方法,而不是便利构造方法来对父类的属性进行初始化


3).构造器链

  • 派生类的指定方法构造器,必须调用其直接父类的指定构造器

  • 便利构造器必须调用同类中定义的其他的构造器(指定和便利均可)

  • 便利构造器必须最终以调用一个指定构造器来完成

指定构造器总是向上代理

便利构造器总是横向代理

![image](file:/Users/Yangzhiyong/Desktop/baseImage.png)


4).两段式构造

class SubClass: MyClass {  //继承自上面的MyClass
    
    var c = 10
    
    init(c : Int) {
    
    ---第一阶段
        
        self.c = c                //《2》
        
        super.init(a: 10, b: 10)  //《1》
        
        print("第一阶段")
        
    ---第二阶段

        self.a = 10000
        print("第二阶段")
    }
}

第一阶段:确保所有的存储属性都初始化完毕

第二阶段:对父类中的存储属性作进一步的处理

两段式构造可以防止属性在被初始化之前访问,也可以防止属性被另外一个构造器意外的赋值

如果A为父类,B继承自A,C继承自B,按照上面的print运行,则结果为:

C: 第一阶段

B:第一阶段

A:第一阶段

A:第二阶段

B:第二阶段

C:第二阶段

构造方法的编译时检查原则:

  • 首先应该将派生类引入的存储属性初始化,然后再向上代理父类的指定构造方法

  • 首先调用父类中的指定构造器实现父类中属性的初始化之后,才可以访问父类中的属性。

  • 在编写便利构造器方法时,我们首先要调用同类中的其他构造方法,然后才可以访问任意属性。

  • 在第一阶段完成之前,我们不能调用任何实例方法,不能访问任何父类中定义的存储属性,也不能引用self。


6).重写指定构造方法(Designated Initalizer)

指定构造方法存在重写,可以在子类中重写为指定构造方法或者便利构造方法均可

便利构造方法不存在重写,在子类中“重写”时,不需要加关键字override

这是因为便利构造方法只能横向代理,不可以通过super关键字来向上代理,所以便利构造方法跟子类没有任何关系。


7).构造器的自动继承

子类自动继承构造方法的条件:

  • 如果子类中没有定义任何的构造方法,且子类中所有的存储属性都有默认缺省值,则会自动竭诚父类中所有的构造方法(包括便利构造方法)
  • 如果子类中只是重写了父类中的某些(而不是全部)指定构造方法,不管子类中的存储属性是否有缺省值,都不会继承父类中的其他构造方法。
  • 如果子类中重写了父类中所有的指定构造方法,不管子类中的存储属性是否有缺省值,都会同时继承父类中所有的便利构造方法

8).必须构造器

必须构造方法是指:该构造方法所属的类的后续子类必须也得实现这个构造方法。关键字required

class MyClass {
    
    required init(a : Int , b : Int) {

        print("super")
    }
}

class SubClass: MyClass {
    
    required init(a: Int, b: Int) {
        
        print("child")
        
        super.init(a: a, b: b)
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 本章将会介绍 存储属性的初始赋值自定义构造过程默认构造器值类型的构造器代理类的继承和构造过程可失败构造器必要构造器...
    寒桥阅读 749评论 0 0
  • 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置实例中每个...
    莽原奔马668阅读 661评论 0 3
  • 构造过程 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置...
    蛊毒_阅读 708评论 0 2
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,129评论 1 6
  • (一)然而,他的激情让他很难实现真正的涅;内在的平静、内心的平和、为人的圆润这些禅修者的特征,并未在他身上显现出来...
    Stone_soul阅读 173评论 0 0