class ClassA {
let numA:Int
init(num: Int){
numA = num
}
} class ClassB: ClassA {
let numB:Int
override init(num: Int) {
numB = num + 1
super.init(num: num)
}
}

  我们可以在init里面对let的实例变量进行赋值,这是初始化方法的重要特点。在Swift中,let声明的值是不变量,无法被写入赋值,这对构建线程安全的API十分有用。而因为init只可能被调用一次,因此在init中我们可以为不变量进行赋值,而不会引起任何线程安全的问题。

与designated初始化方法对应的是在init方法前加上convenience关键字的初始化方法。这类方法是Swift初始化方法中的“二等公民”,只作为补充和提供使用上的方便。所有的convenience初始化方法都必须调用同一个类中的designated初始化完成设置,另外convenience的初始化方法是不能被子类重写或者是从子类中以super的方式被调用的。

class ClassA {
let numA:Int
init(num:Int){
numA = num
} convenience init(bigNum: Bool){
self.init(num: bigNum ? 10000 : 1)
}
} class ClassB: ClassA {
let numB: Int
override init(num: Int) {
numB = num + 1
super.init(num: num)
}
}

  添加了convenience方法了。。

  只要在子类中实现重写了父类的convenience方法所需要的init方法,我们在子类中就也可以使用父类的convenience初始化方法了。

  现在我们打印一下:

let anObj = ClassB(bigNum: true)
print(anObj.numA) let a = ClassB.init(num: 1)
print(a.numB)

  1.初始化路径必须保证对象完全初始化,这可以通过调用本类型的designated初始化方法来得到保证;

  2.子类的designa初始化方法必须调用父类的designated方法,以保证父类也完成初始化

对于某些我们希望子类中一定实现的designated初始化方法,我们可以通过添加required关键字进行限制,强制子类对这个方法重写实现。这样的好处就是可以保证依赖于某个designated初始化方法的convenience一直可以被使用。比如init(bigNum: Bool):,如果我们希望这个初始化方法对于子类一定可用,那么就将init(num: Int)声明为必须,这样我们在子类调用init(bigNum:Bool)时,就始终能找到一条完全初始化的路径了。

  

  另外需要说明是:其实不仅仅是对designated初始化方法,对于convenience的初始化方法,我们也可以加上required以确保子类对其进行实现。这在要求子类不直接使用父类中的convenience初始化方法会非常有帮助。

这篇文章,是抄的王巍前辈的。http://swifter.tips/init-keywords/

Swift-04-Designated&&Convenience的更多相关文章

  1. swift-03-构造器(Designated&&Convenience)

    类里面所有的存储型属性--包括所有继承自父类的属性,都必须在构造过程中设置初始值.   构造器,为了确保所有类实例中的存储型属性都能获得初始值,设置了两个构造器--他们分别是指定构造器和便利构造器. ...

  2. Swift 04.Functions

    函数的基本构造 基本结构 func 函数名 (形参名:形参类型) ->返回值 {实现代码} 如果没有参数,那么也必须把参数的括号带上 如果有多个形参,那么必须以逗号 , 隔开 如果没有返回值,那 ...

  3. Swift - 04 - 浮点型

    import UIKit var str = "Hello, playground" // 显式定义浮点型常量 let PI:Float = 3.141592612312312 l ...

  4. Swift开发第十一篇——Designated、Convenience和Required

    本篇主要讲解 Swift 中 Designated.Convenience和 Required 的使用: 在 OC 中 init 方法是非常不安全的,没人能够保证 init 只被调用一次,也没有人保证 ...

  5. swift入门-day02

    1.函数 2.闭包 3.构造函数基础 4.重载构造函数 5.KVC构造函数 6.遍历构造函数 7.懒加载 8.只读属性 1.函数 掌握函数的定义 掌握外部参数的用处 掌握无返回类型的三种函数定义方式 ...

  6. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...

  7. swift小结02-基础篇

    闭包      类似于 OC 中的 Block,是一段预先定义好的代码,在需要时执行   闭包表达式格式:  { (形参名称1: 形参类型1, 形参名称2: 形参类型2, ...) -> 返回值 ...

  8. Swift 入门之简单语法(六)

    KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [Str ...

  9. Swift - 构造函数

    Swift 2.0 构造函数基础 构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重 ...

  10. Swift与Objective-C API的交互

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定 ...

随机推荐

  1. JavaScript验证函数大全

    1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert("不能超过50个字符 ...

  2. iPhone开发常问的十个问题

    iPhone开发常问的十个问题 前言 今天去stackoverflow.com上看了一下iPhone标签下排名最高的10个问题,将它们整理出来,希望这些常见问题能帮到一些iPhone开发的初学者.本来 ...

  3. MatLab GUI Load .mat File 导入mat文件

    在MatLab中,我们用GUI时,有时候需要导入mat格式的图片,但是在GUI中调用load和在命令行里调用load不一样,在命令行里调用load('im.mat'),加载进去是uint8的矩阵,但是 ...

  4. uva729

    /*题目一大堆,其实意思就是长度为n个二进制数,里面有h个1,将这个二进制数进行全排列,然后输出*/ #include"iostream" #include"algori ...

  5. sql语句清除mssql日志

    DUMP TRANSACTION TestDB WITH NO_LOG 清除日志 DBCC SHRINKFILE ('TestDB_log',1) 收缩数据库文件            -----直接 ...

  6. linux ext2 文件系统学习

    Linux  ext2文件系统理解 硬盘组成: 硬盘由多个圆形硬盘片组成.按照硬盘片能够容纳的数据量分为单盘和多盘.硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头.机械手臂不动硬盘旋转一 ...

  7. SEP图示

    Icon Description This icon indicates the following status: The client can communicate with Symantec ...

  8. mysql外键实战

    一.基本概念 1.MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户 进行明确的索引.用于外键关系的字段必 ...

  9. Web中的图标

    随着时代的变迁与技术的不断的更新,在当今这个时代,Web中的图标(Icons)不再仅仅是局限于<img>.除了<img>直接调用Icons文件之外,还有Sprites(俗称雪碧 ...

  10. ASP.NET MVC4系列验证机制、伙伴类共享源数据信息(数据注解和验证)

    一,mvc前后台验证 自定义属性标签MyRegularExpression using System; using System.Collections.Generic; using System.C ...