IDE:Xcode Version7.3.1

指定构造器:

  1>名字为init的方法前没有前缀(子类重写时有override除外),

  2>一个类中至少有一个指定构造器,其必须初始化类中的所有实例存储属性

便利构造器:

  1>前缀为convenience的init方法,便利构造器属于次要的,辅助性的构造器.

  2>便利构造器必须调用同一个类中的其他构造器完成其初始化.

  3>只有类中才有便利构造器,枚举结构体中是没有的.

构造器链:(即构造器之间的调用)

  1>指定构造器总是向上调用父类的构造器(如果有父类)

  2>便利构造器总是横向调用当前类的其他构造器

  3>构造器链的最终节点一定是父类的指定构造器(如果有父类)

         

    

  

class Fruit{
var name:String
var weight:Double
  //定义指定构造器 最少一个且这一个要负责初始化勒种所有的实例存储属性
init(name:String){//①
self.name = name
self.weight = 0.0
}
//定义便利构造器
convenience init(name:String,weight:Double){//②
//调用本类中的①号指定构造器
self.init(name:name)
self.weight = weight
}
//定义另一个便利构造器 有外部参数
convenience init(n name:String,w weight:Double){//③
//调用本类的②号便利构造器
self.init(name:name)
}
} class Apple:Fruit{
var color:String
init(name:String, weight:Double, color:String){//④
    //指定构造器必须先向上调用父类构造器,然后才能对继承得到的属性赋值
  //  self.name = "123"//会报错,因为还没有调用父类的构造器
// print("color:\(self.color)")//报错 因为还没有初始化
self.color = color
print("color:\(self.color)")//初始化了 ok了
//子类的指定构造器必须调用父类的指定构造器,此处调用父类①号构造器
super.init(name: name)
self.weight = weight
}
init(){//⑤
//指定构造器必须先初始化当前类中定义的实例存储属性(子类的独有属性),然后才能向上调用父类构造器
self.color = ""//这一行如果写在super.init(name:"")后面就会报错
//子类指定构造器必须调用父类的指定构造器,此处调用父类①号构造器
super.init(name: "")
self.weight = 0.0
}
//定义一个便利构造器
convenience init(name:String,color:String){//⑥
//调用本类中④号指定构造器
self.init(name:name,weight:0.0,color:color)
}
//定义另一个便利构造器
convenience init(n name:String,c color:String){//⑦
//调用本类中⑥便利构造器
self.init(name:name,color:color)
}
}

Swift构造器链的更多相关文章

  1. Swift中的便利构造器和构造器链

    import UIKit // 1.一个类中至少有一个指定构造器, 其必须负责初始化类中所有的实例存储属性 // 2.便利构造器属于次要的, 辅助性的构造器 // 3.类中可以不定义便利构造器, 便利 ...

  2. 学习Swift -- 构造器(下)

    构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某 ...

  3. 学习Swift -- 构造器(中)

    构造器(中) 值类型的构造器代理 构造器可以通过调用其它构造器来完成实例的部分构造过程.这一过程称为构造器代理,它能减少多个构造器间的代码重复. 构造器代理的实现规则和形式在值类型和类类型中有所不同. ...

  4. Swift构造器(Initializer)与析构器(Deinitializer)

    为了初始化结构体和类等类型的实例属性. 默认构造器 struct Fahrenheit { var temperature: Doubleinit(){ temperature = 32.0 } } ...

  5. Swift构造器重载

    与函数一样,方法也存在重载,其重载的方式与函数一致.那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的.一.构造器重载概念Swift中函数重载的条件也适用于构造器,条件如下:函数有相同的名字:参 ...

  6. 学习Swift -- 可选链

    可空链式调用 可空链式调用是一种可以请求和调用属性.方法及下标的过程,它的可空性体现于请求或调用的目标当前可能为空(nil).如果可空的目标有值,那么调用就会成功:如果选择的目标为空(nil),那么这 ...

  7. 学习Swift -- 构造器(上)

    构造器(上) 构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个存储型属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initi ...

  8. Swift 可选链-备

    在Swift程序表达式中会看到问号(?)和感叹号(!),它们代表什么含义呢?这些符号都与可选类型和可选链相关,下面来看看可选链. 可选链: 类图: 它们之间是典型的关联关系类图.这些类一般都是实体类, ...

  9. Swift 可选链

    可选链(Optional Chaining)是一种可以请求和调用属性.方法和子脚本的过程,用于请求或调用的目标可能为nil. 可选链返回两个值: 如果目标有值,调用就会成功,返回该值 如果目标为nil ...

随机推荐

  1. Robotlegs2的Starling扩展

    有个老外写了robotleges2的starling扩展,地址是 https://github.com/brean/robotlegs2-starling-viewmap 需要注意的是要先创建一个基于 ...

  2. c++分块算法(暴力数据结构)

    快要noip了,该写些题解攒攒rp了(逃) 看到题解里那么多线段树啊,树状数组啊,本蒟蒻表示:这都是什么鬼东西? 在所有高级数据结构中,树状数组是码量最小的,跑的也基本是最快的,但理解很难,并且支持的 ...

  3. 牛客网提高组模拟赛第七场 T3 洞穴(附bitset介绍)

    就是DP. 我们可以很简单的想到要枚举中间点,进行边数的转移. 但是因为边长数据范围很大,所以我们考虑log的倍增. 状态设计为\(dp[i][j][k]\),为从节点\(i\)走\(2^k\)步能否 ...

  4. 201621123023《Java程序设计》第2周学习总结

    一. 本周学习总结 引用类型变量存放指向对象的引用(类似于地址): == 与 equals 区别在于:==比较的是引用是否相等, 而equals则比较指向对象的内容是否相等: 因为String的不可变 ...

  5. for循环 | range 对象

    # ### for循环 # 循环 遍历 迭代 # 把列表的元素一一的拿出来遍历 listvar = ["黄雄大","黄文","黄仪正",&q ...

  6. offsetWidth和width的区别

    1.offsetWidth属性可以返回对象的padding+border+width属性值之和,style.width返回值就是定义的width属性值. 2.offsetWidth属性仅是可读属性,而 ...

  7. leecode刷题(15)-- 验证回文字符串

    leecode刷题(15)-- 验证回文字符串 验证回文字符串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 ...

  8. UITabBarController的属性

    viewControllers UIViewController的数组,即要显示的VC,数组中VC的顺序即是实际展示的VC的顺序.UITabBarController最多展示5个tab,如果数组中的元 ...

  9. dotnet core2常用命令

    dotnet --info 来查看是否安装成功dotnet new -alldotnet new mvc 创建MVC项目dotnet new more 查看项目类型dotnet restore (恢复 ...

  10. fdisk 和 parted 分区工具

    fdisk 和 parted: fdisk 是用来对 Linux 下的 MBR 分区进行操作的一款分区工具, 由于 MBR 的设计缺陷导致 MBR 不能处理大于 2TB 的硬盘, 并且主分区个数不能超 ...