Swift 中类的两段式构造

本文和大家分享的主要是swift中类的两段式构造相关内容,一起来看看吧,希望对大家学习swift有所帮助。

两段式构造

第一阶段:

1. 程序调用子类的某个构造器

2. 为实例分配内存, 此时实例的内存还没有被初始化

3. 指定构造器确保子类定义的所有实例存储属性都已被赋初值

4. 指定构造器将调用父类的构造器, 完成父类定义的实例存储属性的初始化

5. 沿着调用父类构造器的构造器链一直往上执行, 直到到达构造器链的最顶部

第二阶段:

1. 沿着继承树往下, 构造器此时可以修改实例属性和访问self, 甚至可以调用实例方法

2.

最后, 构造器链中的便利构造器都有机会定制实例和使用self

3.

为了使得构造过程更加安全, Swift进行了安全检查

4.

安全检查

· 安全检查 1:指定构造器必须先初始化当前类中定义的实例存储属性, 然后才能向上调用父类构造器

· 安全检查 2:指定构造器必须向上调用父类构造器, 然后才能对继承得到的属性赋值

· 安全检查 3:便利构造器必须先调用同一个类的其他构造器, 然后才能对属性赋值

· 安全检查 4:构造器在第一阶段完成之前, 不能调用实例方法, 不能读取实例属性

class Person {

var height: Double

var weight: Double

// 定义指定构造器

init(height: Double, weight: Double) {

self.height = height

self.weight = weight

}

// 定义便利构造器(使用convenience修饰)

convenience init(h height: Double, w weight: Double) {

self.init(height: height, weight: weight)

}

}

class ManPerson {

var sex: String!

init(sex: String, height: Double, weight: Double) {

// print(super.height) 不能再父类初始化之前调用父类中的属性

super.init(height: height, weight: weight)

super.height = 178

print(self.height)

// print(self.sex) 不能在本类中的属性没有进行初始化的时候进行调用

// 会出现:fatal error: unexpectedly found nil while unwrapping an Optional value错误

self.sex = sex

print(self.sex)

}

convenience init(s sex: String, h height: Double, weight: Double) {

// 在调用其他构造器之前, 不能访问或修改任何实例存储属性

// print(self.height) 错误

// super.height = height 错误

self.init(sex: sex, height: height, weight: weight)

}

}

var man = Man(sex: "男", height: 178, weight: 62.0)

来源:Cmb Blog

时间: 2024-10-10 21:23:24

Swift 中类的两段式构造的相关文章

Swift中类的两段式构造(类的构造过程)

import Foundation /* 类的构造需要两个阶段: 第一阶段: 1.程序调用子类的某个构造器 2.为实例分配内存, 此时实例的内存还没有被初始化 3.指定构造器确保子类定义的所有实例存储属性都已被赋初值 4.指定构造器将调用父类的构造器, 完成父类定义的实例存储属性的初始化 5.沿着调用父类构造器的构造器链一直往上执行, 直到到达构造器链的最顶部 第二阶段: 1.沿着继承树往下, 构造器此时可以修改实例属性和访问self, 甚至可以调用实例方法 2.最后, 构造器链中的便利构造器都

Swift中类和结构体

1. 类和结构体对比 Swift 中类和结构体有很多共同点: 定义属性用于存储值 定义方法用于提供功能 定义附属脚本用于访问值 定义构造器用于生成初始化值 通过扩展以增加默认实现的功能 符合协议以对某类提供标准功能 与结构体相比,类还有如下的附加功能: 继承允许一个类继承另一个类的特征 类型转换允许在运行时检查和解释一个类实例的类型 解构器允许一个类实例释放任何其所被分配的资源 引用计数允许对一个类的多次引用 2. 类和结构体的定义语法 类和结构体有着类似的定义方式.我们通过关键字class和s

笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树

出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{-i-j-k-m--},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况: 解题: 1 void FindSumFactor(int *array, int length, int sum) { 2 int left=0, right=length-1; 3 whil

【Swfit】Swift与OC两种语法写单例的区别

Swift与OC两种语法写单例的区别 例如写一个NetworkTools的单例 (1)OC写单例 1 + (instancetype)sharedNetworkTools { 2 static id instance; 3 4 static dispatch_once_t onceToken; 5 6 dispatch_once(&onceToken, ^{ 7 instance = [[self alloc] init]; 8 //这里可以做一些初始化 9 }); 10 11 return i

高效的两段式循环缓冲区──BipBuffer

Simon Cooke,美国 (原作者) 北京理工大学 20981 陈罡(翻译) 写在前面的话: 循环缓冲区是一个非常常用的数据存储结构,已经被广泛地用于连续.流数据的存储和通信应用中.对于循环缓冲区,传统的操作方法是开辟一块连续的存储区,不 断地写入数据,当写入到存储区的末尾的时候,再从存储区的首部再开始写入数据,由此不断地重复下去构成了循环缓冲区.偶曾经写过很多循环缓冲区,也看过很 多人编写的循环缓冲区,但是拜读Simon Cooke先生的文章────“两段式”循环缓冲区(原文名称是:The

分布式事务:两段式提交(最终一致性)

[MySQL如何实现分布式事务?] http://www.linuxidc.com/Linux/2013-10/91925.htm Innodb存储引擎支持XA事务,通过XA事务可以支持分布式事务的实现.分布式事务指的是允许多个独立的事务资源(transac tional resources)参与一个全局的事务中.事务资源通常是关系型数据库系统,也可以是其它类型的资源. 全局事务要求在其中所有参与的事务要么全部提交,要么全部回滚,这对于事务原有的ACID要求又有了提高.另外,在使用分布式事务时候

SWIFT中计算两个日期间隔多少小时

SWIFT中如何计算两个日期间隔多少个小时,其实几句代码就可以搞定了,Very Easy,在Playground内输入以下代码 var date1 = "2015-06-26 8:15:10" var dateformatter = NSDateFormatter() dateformatter.dateFormat = "yyyy-MM-dd hh:mm:ss" var dateresult = dateformatter.dateFromString(date1

Swift难点-继承中的构造规则实例详解

一.两种构造器-指定构造器和便利构造器 指定构造器:类中必备的构造器,为所有的属性赋初值.(有些子类可能不需要显示声明,因为默认从基类继承了) 便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值.(仅在必要的时候声明) 举例 [plain] view plaincopy class Food { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[

Swift难点-继承中的构造规则实例具体解释

关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html 为什么要有构造器:为类中自身和继承来的存储属性赋初值. 一.两种构造器-指定构造器和便利构造器 指定构造器:类中必备的构造器.为全部的属性赋初值.(有些子类可能不须要显示声明,由于默认从基类继承了) 便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值.(仅在必要的时候声明) 举例 cla