美文网首页
swift学习-初始化器

swift学习-初始化器

作者: 男人宫 | 来源:发表于2020-04-06 22:16 被阅读0次

类,结构体,枚举都可以定义初始化器

类有两种初始化器:指定初始化器和便利初始化器

//指定初始化器
init(parameters){
    statements
}
//便利初始化器
convenience init(parameters){
    statements
}
    • 每个类至少有一个指定初始化器,指定初始化器是类的主要初始化器(如果自己不创建初始化器,那么类会默认创建一个指定初始化器,如果自己定义了指定初始化器,那么默认的初始化器就不存在了.但如果只是创建了便利初始化器,那么默认的指定初始化器还存在)
    • 默认初始化器总是类的指定初始化器
    • 类偏向于少量的指定初始化器,一个类通常只有一个指定的初始化器

初始化器的相互调用规则:
1.指定初始化器必须从它的直系父类调用指定的初始化器(有子类的时候)
2.便利初始化器必须从相同的类里调用另一个初始化器
3.便利初始化器最终必须调用一个同类的指定初始化器


  • 当子类创建自己的指定初始化器时,先要把自己的存储属性初始化完成,然后再调用父类的指定初始化器(super.init(....) )

两段式初始化器:
第一阶段: 初始化所有存储属性
1.外层调用指定/便利初始化器(意思是比如开始创建实例对象的时候,会调用初始化器创建实例)
2.分配内存给实例,但未初始化(分配了内存空间,但数据还没写入,可以通过汇编查看)
3.指定初始化器确保当前类定义的存储属性都初始化
4.指定初始化器调用父类的指定初始化器,不断向上调用,形成初始化链
第二阶段:设置新的存储属性(已经初始化完了,可以设置新值)
1.从顶部初始化器往下,链中的没一个指定初始化器都有机会进一步定制实例
2.初始化器现在能够使用slef(访问,修改它的属性,调用它的实例方法等等)
3.最终,链中的任何便利初始化器都有机会定制实例以及使用self


    • 安全检查:
  • 指定初始化器必须在保证调用父类指定初始化器之前,其所在类定义的所有存储属性都要初始化完成
  • 指定初始化器必须先调用父类的初始化器,然后才能为继承的属性设置新值(相当于前面中的第二阶段)
  • 便利初始化器必须先调用同类中的其它初始化器,然后才能为任意属性设置新值(相当于前面中的第二阶段)
  • 初始化器在第一阶段完成之前,不能调用任何势力方法,不能读取任何实例属性的值,也不能引用self

相关文章

  • 认识Swift系列13之对象初始化

    Swift中初始化器: 指定初始化器(designated initializer) 便捷初始化器(conveni...

  • swift初始化 init

    swift初始化器有两种: 指定初始化器(designated initializer) 便捷初始化器(conve...

  • Swift语法 -- [12 - 初始化器]

    Swift 初始化 1. 初始化器 类、结构体、枚举都可以定义初始化器 类有2种初始化器: 指定初始化器(desi...

  • swift - 初始化

    // 同于 Objective-C 的初始化器,Swift 初始化器不返回值 初始化器 默认的属性值 自定义初始化...

  • swift学习-初始化器

    类,结构体,枚举都可以定义初始化器 类有两种初始化器:指定初始化器和便利初始化器 每个类至少有一个指定初始化器,指...

  • Swift 5.x - 析构函数(中文文档)

    引言 继续学习Swift文档,从上一章节:初始化,我们学习了Swift初始化相关的内容,如类、结构体和枚举初始化方...

  • swift学习-重写初始化器

    当重写父类的指定初始化器时,必须加上override(即使子类的实现是便利初始化器,意思就是在父类中是指定初始化器...

  • Swift构造器

    推荐swiftGG的官方文档翻译《swift构造器》 swift类的构造分为两个阶段,第一个阶段是指定构造器初始化...

  • Swift 5.1 (14) - 初始化和反初始化

    Swift 5.1 (14) - 初始化和反初始化Swift 5.1 (14) - 初始化和反初始化

  • swift初始化器

    初始化器 类、结构体、枚举都可以定义初始化器 类初始化器 类有2种初始化器:指定初始化器(designated i...

网友评论

      本文标题:swift学习-初始化器

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