首先,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. python-摩斯码转换

    意义:简单实现摩斯码的破译和生成 代码: #-*- coding: UTF-8 -*- ' __date__ = '2016/2/2' import pprint import re chars = ...

  2. linux实用指令---持续更新

    awk '!a[$0]++'  a > b   删除重复行 ldd  判断某条命令需要哪些共享库文件的支持          ---------------      ]$  ldd a.out ...

  3. NET Core 的 Views

    NET Core 十种方式扩展你的 Views 原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html作者:Jür ...

  4. COB (Chip On Board) 製程介紹/簡介/注意事項 II

    銀膠 (Silver glue) 如果晶圓有接地或是散熱需求時,一般都會採用[銀膠],如果沒有的話則會採用[厭氧膠].[厭氧膠]顧名思義就是阻隔它與空氣接觸後就會自然固化,不需要高溫烘烤.使用銀膠則需 ...

  5. 解析配置文件ConfigParser模块

    一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类似于key-value 的配置 ...

  6. 前端web应用组件化(一) 徐飞

    https://github.com/xufei/blog/issues/6 Web应用的组件化(一) 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也 ...

  7. Ultra-QuickSort(归并排序)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 49267   Accepted: 18035 ...

  8. rgbdslam_v2安装并使用

    rgbdslam_v2安装并使用 此文档为原创,转载请注明来自CSDN Jasmine_shine的专栏 网址:http://blog.csdn.net/jasmine_shine/article/d ...

  9. c# 柱状图(转载)

    // c# 显示柱状图 using System; using System.Data; using System.Configuration; using System.Web; using Sys ...

  10. spring mvc框架 遇到的问题

    web.xml配置文件代码: <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...