Swift中类的两段式构造(类的构造过程)
import Foundation /*
类的构造需要两个阶段:
第一阶段:
1.程序调用子类的某个构造器
2.为实例分配内存, 此时实例的内存还没有被初始化
3.指定构造器确保子类定义的所有实例存储属性都已被赋初值
4.指定构造器将调用父类的构造器, 完成父类定义的实例存储属性的初始化
5.沿着调用父类构造器的构造器链一直往上执行, 直到到达构造器链的最顶部
第二阶段:
1.沿着继承树往下, 构造器此时可以修改实例属性和访问self, 甚至可以调用实例方法
2.最后, 构造器链中的便利构造器都有机会定制实例和使用self 为了使得构造过程更加安全, Swift进行了安全检查
安全检查1:指定构造器必须先初始化当前类中定义的实例存储属性, 然后才能向上调用父类构造器
安全检查2:指定构造器必须向上调用父类构造器, 然后才能对继承得到的属性赋值
安全检查3:便利构造器必须先调用同一个类的其他构造器, 然后才能对属性赋值
安全检查4:构造器在第一阶段完成之前, 不能调用实例方法, 不能读取实例属性
*/ class Person { var name: String!
var weight: Double // 定义指定构造器
init(name: String, weight: Double) {
self.name = name
self.weight = weight
} // 定义便利构造器(使用convenience修饰)
convenience init(n name: String, w weight: Double) {
self.init(name: name, weight: weight)
}
} class Man: Person { var sex: String! init(sex: String, name: String, weight: Double) {
// print(super.name) 不能再父类初始化之前调用父类中的属性
super.init(name: name, weight: weight)
super.name = "lala"
print(self.name)
// print(self.sex) 不能在本类中的属性没有进行初始化的时候进行调用
// 会出现:fatal error: unexpectedly found nil while unwrapping an Optional value错误
self.sex = sex
print(self.sex)
} convenience init(s sex: String, n name: String, weight: Double) { // 在调用其他构造器之前, 不能访问或修改任何实例存储属性
// print(self.name) 错误
// super.name = name 错误
self.init(sex: sex, name: name, weight: weight)
}
} var man = Man(sex: "男", name: "Rinpe", weight: 62.0)
Swift中类的两段式构造(类的构造过程)的更多相关文章
- Swift中类的初始化器与继承
初始化是类,结构体和枚举类型实例化的准备阶段.这个阶段设置这个实例存储的属性的初始化数值和做一些使用实例之前的准备以及必须要做的其他一些设置工作. 通过定义构造器(initializers)实现这个实 ...
- Java语法专题1: 类的构造顺序
合集目录 Java语法专题1: 类的构造顺序 问题 下面的第二个问题来源于Oracle的笔试题, 非常经典的一个问题, 我从07年开始用了十几年. 看似简单, 做对的比例不到2/10. 描述一下多级继 ...
- Swift中文教程(五)--对象和类
原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...
- c++ 类的构造顺序
在单继承的情况下,父类构造先于子类,子类析构先于父类,例: class A { public: A() { cout << "A" << endl; } ~ ...
- [Xcode 实际操作]九、实用进阶-(6)在Swift文件中调用Object-C的类和方法
目录:[Swift]Xcode实际操作 本文将演示在Swift文件中调用Object-C的类和方法. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个Object- ...
- Python动态构造类:借助强悍的内建 type()
内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下: type(name, bases, dict) 返回一个新的type对象. 基本上是 class 语句的动态形式. 参数: ...
- 关于Java构造类与对象的思考
简单记录一下Java构造类与对象时的流程以及this和super对于特殊例子的分析. 首先,接着昨天的问题,我做出了几个变形: Pic1.原版: Pic2.去掉了T.foo方法中的this关键字: P ...
- Swift中类的使用
主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是Swift中的 ...
- 转:Delphi2010新发现-类的构造和析构函数功能
Delphi2010发布了. 虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究. 今天有点时间试了一下新功能. 本来C#和Delphi.NE ...
随机推荐
- java学习笔记(10) —— ActionContext、ServletActionContext、ServletRequestAware用法
核心思想 1.ActionContext HttpServletRequest getAttribute setAttribute ActionContext get put //ActionCont ...
- Android基本组件-Activity
什么是Activity 在Android程序中,每个Activity继承自android.app.Activity, 有一个与之对应的xml布局文件, 一个界面对应一个Activity, 每个Acti ...
- DedeCMS标签 PHP判断语句写法
缩略图标签的判断写法,如果有图片就显示,没图片就显示别的. {dede:field name=litpic runphp='yes'} if(!empty(@me)) { @me="< ...
- Properties配置文件
package file; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; ...
- 性能测试工具--SIEGE安装及使用简介
官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bo ...
- iOS常见异常Exec_Bad_Access问题解决办法
iOS常见异常Exec_Bad_Access问题解决办法 在iOS开发中,经常遇到Exec_Bad_Access异常,导致程序奔溃问题,一般这个问题都是因为过早的release对象,然后又对该 ...
- angularJs项目实战!04:angularjs的性能问题
上一篇文章中我花了很多口舌去介绍angularjs是一个中型框架,面对大型应用时少不了第三方类库的配合.而我的核心议题是:如何以angularjs的思路使用其他类库,这里jquery是最好的例子了,谁 ...
- Activity大致会经过如下四个状态
1.活动主题:当前Activity位于前台,用户可见,可以获得焦点.2.暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点.3.停止状态:该Activity不可见,失 ...
- PullToRefreshListView 内嵌checkbox 数据丢失问题
在PullToRefreshListView 内部内嵌了Checkbox如下图所示: 原本设计思路是:对CheckBox 进行 setOnCheckedChangeListener 监听 当Check ...
- Linux sar使用
[root@ywcrmdb ~]# sar -d 1 10 Linux 2.6.32-220.el6.x86_64 (ywcrmdb) 2014年04月19日 _x86_64_ (4 CPU) 1 ...