首先,Swift 为类定义了两种初始化器来确保类中所有的储存属性都能得到一个初始化值。这两种初始化器就是「指定初始化器」(Designated Initializer)与「便利初始化器」(Convenience Initializer)。

指定初始化器与便利初始化器

指定初始化器是类的最主要的初始化器,它会将类中所有的属性赋值初始化,并且一路往上调用类的父类的指定初始化器去初始化它们各自引入的属性。类可以有许多个指定初始化器,也可以只有一个,但必须至少有一个。

便利初始化器顾名思义就是方便开发者调用的初始化器,它必须调用同个类的指定初始化器,提供一些默认的参数给指定初始化器来生成一个默认的类的实例。一个类可以没有便利初始化器。

初始化器链

为了简化指定初始化器与便利初始化器的关系,我们规定了以下三条规则:

  • 指定初始化器必须调用其父类的指定初始化器

  • 便利初始化器初始化器必须调用该类中另一个初始化器

  • 便利初始化器最终必须调用一个指定初始化器

简单的说,就是指定初始化器必须在类的继承关系中一路向上调用,便利初始化器必须在该类中一路往指定初始化器调用。
画成图表表示,就是:

上图可以看到,父类有一个指定初始化器和两个便利初始化器,一个便利初始化器调用了另一个遍历初始化器,但最终他们都会调用指定初始化器。
而在子类中,指定初始化器最终是向上,调用其父类的指定初始化器。

初始化的两个步骤

在 Swift 中,类的初始化需要经历两个步骤,第一个步骤中,每一个该类引入的储存属性都需要给赋上一个初始值。完成后,执行第二个步骤,每个类都可以再对属性进行自定义修改。
详细点说,即是:

步骤一

  • 一个类的指定或便利初始化器需被调用

  • 类的实例的内存被申请,但还没有初始化

  • 指定初始化器确保当前类引入的所有储存属性都初始化

  • 指定初始化器调用其父类的指定初始化器,继续让父类去初始化它所引入的储存属性

  • 上面这个过程一直进行直到最终的根类的指定初始化器被调用

  • 当根类的指定初始化器调用后,该类的实例就已经确保了所有储存属性都已经初始化完成,步骤一完成。

步骤二

  • 步骤二是从根类的指定初始化器开始的,一层层到最终的子类的指定初始化器

  • 在这个步骤中,每个类都有机会对已经步骤一中初始化完成的实例再次进行自定义修改。此时初始化器已经可以访问 self,修改属性或者调用实例方法了。

初始化器的继承与覆盖

不像 Objective-C,Swift 的类并不会默认继承其父类的初始化器。但也有例外,只要满足了一定条件,子类还是会自动继承父类的初始化器的。我们定义了以下规则:

规则一

如果你的子类没有定义任何指定初始化器,则其会自动继承其父类的所有指定初始化器

规则二

如果你的子类实现了其父类的所有指定初始化器,不管是自定义的实现还是因为规则一造成的实现,该子类自动继承其父类所有的便利初始化器。

与 Objective-C 的初始化器交互

Swift 调用 Objective-C 的类,其初始化方法自动省去"Init"或"InitWith"关键字。比如

1
2
3
4
//Objective-C
UILabel *label = [UILabel alloc] init];
 
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

在 Swift 中,写成

1
2
3
4
//Swift
let label: UILabel = UILabel()
 
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

你也不需要调用 alloc,Swift 会帮你搞定这步的。

另外,某些 Objective-C 中方便的用于类的初始化的工厂方法,也映射到了 Swift 中,比如

1
2
//Objective-C
UIColor *color = [UIColor colorWithRed:0.5 green:0.0 blue:0.5 alpha:1.0];

在Swift中:

1
2
//Swift
let color = UIColor(red: 0.5, green: 0.0, blue: 0.5, alpha: 1.0)

Swift 中类的初始化器与继承的更多相关文章

  1. Swift中类的初始化器与继承

    初始化是类,结构体和枚举类型实例化的准备阶段.这个阶段设置这个实例存储的属性的初始化数值和做一些使用实例之前的准备以及必须要做的其他一些设置工作. 通过定义构造器(initializers)实现这个实 ...

  2. 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

    1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...

  3. Swift中类与结构的初始化

    前言:通过学习与研究swift3.0的官方文档关于初始化这部分可以总结为一句话:类与结构是确保一个类型的实例可以使用之前,其所有存储属性都得到了正确的赋值. 一,结构的初始化1 struct Firs ...

  4. Swift快速给Cocoa库内置类添加便捷初始化器

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Cocoa中的NSShadow类默认没有我们需要的实例方法,为 ...

  5. swift 学习- 17 -- 析构器

    // 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ...

  6. Swift 学习笔记 (初始化)

    初始化是为类 结构体 或者枚举准备实例的过程.这个过程需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其它所必需的配置或初始化. 初始化器 初始化器在创建特定类型的实例时被调 ...

  7. Swift中类的使用

    主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是Swift中的 ...

  8. java中类的初始化和对象的初始化

    静态的属于全局静态区,这个部分独立存在,不管是成员还是块,都是静态的,大家地位相等,先到先得. 然后是成员初始化,这个部分在类的构造函数前初始化,因为编译器(或者设计者)可能认为构造函数调用了这个成员 ...

  9. swift_初始化器的使用

    //: Playground - noun: a place where people can play import Cocoa ***************************结构体与Cla ...

随机推荐

  1. Flink资料(7) -- 背压监控

    背压(backpressure)监控 本文翻译自Back Pressure Monitoring --------------------------------------------------- ...

  2. C++设计模式之工厂模式

    //产品父类声明#pragma once #include "iostream" using namespace std; class Product { public: virt ...

  3. SQL Server 函数执行

    在SQL Server 不只是procedure 可以用execute 来执行 function 也是可以的 例子: create function ufn_A( @i as int) returns ...

  4. LINUX查看硬件配置命令

    LINUX查看硬件配置命令   系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinf ...

  5. Flex4开发笔记(与JAVA交互)

    (由于本人也是第一次接触flex开发,因此将开发过程中问题记录留档) 一.数据交换过程 借助BlazeDS可以实现flex与java之间的数据交互,大体流程如下: 1.导入blazeds的文件(配置w ...

  6. 服务没有mysql

    你安装了mysql没有,没有就先安装,安装好mysql以后,在bin目录下有个mysqld.exe,运行这个程序就可以添加mysql服务,但是运行这个程序需要使用参数,否则就会以命令行窗口形式启动MY ...

  7. Java-----Excel转HTML

    尽管是转别人的(忘了哪转过来的了),但此处标为原创不是为了提高訪问量,也不是为了其它.仅仅是纯粹的认为有实际用途.希望能给很多其它有此需求的人看到并能帮到他们就足够了 所需jar包:jxl.jar p ...

  8. HP DL360 G7通过iLO部署系统

    HPDL360 G7通过iLO部署系统 HP DL360 G7是没有光驱的服务器,可使用USB外置光驱.PXE网络安装.ILO方式的安装操作系统 一.HP iLO 简介 iLO 是一组芯片,内部是vx ...

  9. 关于Apacheserver的訪问控制

    Apache的訪问控制指对不论什么资源的不论什么方式的訪问控制. 一.基于主机或者IP地址的控制 这样的訪问控制基于訪问者的主机名或者IP地址,通过使用 Deny 和 Allow 指令.实现同意或者禁 ...

  10. 从零开始Unity3D游戏开发【4 材质球和渲染纹理】

    [创建材质球] 1.Project 面板下  create-Material 然后将材质球拖放到物体,物体的颜色便会和材质球相同: [渲染纹理 RenderTexture]