与函数一样,方法也存在重载,其重载的方式与函数一致。那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的。
一、构造器重载概念
Swift中函数重载的条件也适用于构造器,条件如下:
函数有相同的名字;
参数列表不同或返回值类型不同,或外部参数名不同;
Swift中的构造器可以满足以下两个条件,代码如下:

  1. class Rectangle {
  2. var width : Double
  3. var height : Double
  4. init(width : Double, height : Double) { ①
  5. self.width   = width
  6. self.height  = height
  7. }
  8. init(W width : Double,H height : Double) {  ②
  9. self.width   = width
  10. self.height  = height
  11. }
  12. init(length : Double) { ③
  13. self.width   = length
  14. self.height  = length
  15. }
  16. init() {                        ④
  17. self.width   = 640.0
  18. self.height  = 940.0
  19. }
  20. }
  21. var rectc1 = Rectangle(width : 320.0, height : 480.0)   ⑤
  22. println("长方形:\(rectc1.width) x \(rectc1.height)")
  23. var rectc2 = Rectangle(W : 320.0, H : 480.0)    ⑥
  24. println("长方形:\(rectc2.width) x \(rectc2.height)")
  25. var rectc3 = Rectangle(length: 500.0)   ⑦
  26. println("长方形3:\(rectc3.width) x \(rectc3.height)")
  27. var rectc4 = Rectangle()    ⑧
  28. println("长方形4:\(rectc4.width) x \(rectc4.height)")

上述代码第①~④行定义了4个构造器,其他是重载关系。从参数个数和参数类型上看,第①行和第②行的构造器是一样的,但是它们的外部参数名不同,所以在第⑤行调用的是第①行的构造器,第⑥行调用的是第②行的构造器。
第③行和第④行的构造器参数个数与第①行不同,所以在第⑦行调用的是第③行的构造器,第④行调用的是第⑧行的构造器。
二、值类型构造器代理
为了减少多个构造器间的代码重复,在定义构造器时,可以通过调用其他构造器来完成实例的部分构造过程,这个过程称为构造器代理。构造器代理在值类型和引用类型中使用方式不同,本节我们先介绍值类型构造器代理。
将上一节的示例修改如下:

  1. struct Rectangle {
  2. var width : Double
  3. var height : Double
  4. init(width : Double, height : Double) { ①
  5. self.width   = width
  6. self.height  = height
  7. }
  8. init(W width : Double,H height : Double) {  ②
  9. self.width   = width
  10. self.height  = height
  11. }
  12. init(length : Double) { ③
  13. self.init(W : length, H : length)
  14. }
  15. init() {                        ④
  16. self.init(width: 640.0, height: 940.0)
  17. }
  18. }
  19. var rectc1 = Rectangle(width : 320.0, height : 480.0)   ⑤
  20. println("长方形:\(rectc1.width) x \(rectc1.height)")
  21. var rectc2 = Rectangle(W : 320.0, H : 480.0)    ⑥
  22. println("长方形:\(rectc2.width) x \(rectc2.height)")
  23. var rectc3 = Rectangle(length: 500.0)   ⑦
  24. println("长方形3:\(rectc3.width) x \(rectc3.height)")
  25. var rectc4 = Rectangle()    ⑧
  26. println("长方形4:\(rectc4.width) x \(rectc4.height)")

将Rectangle声明为结构体类型,其中也有4个构造器重载。在第③行和第④行的构造器中使用了self.init语句,self指示当前实例本身,init是本身的构造器,第③行的self.init(W : length, H : length)语句是在调用第②行定义的构造器,第④行的self.init(width: 640.0, height: 940.0)语句是在调用第①行定义的构造器。
这种在同一个类型中通过self.init语句进行调用就是我们说的构造器代理。
三、引用类型构造器横向代理
引用类型构造器代理就是类构造器代理。由于类有继承关系,类构造器代理比较复杂,分为横向代理和向上代理。
横向代理类似于值类型构造器代理,发生在同一类内部,这种构造器称为便利构造器(convenience initializers)。
向上代理发生在继承情况下,在子类构造过程中要先调用父类构造器,初始化父类的存储属性,这种构造器称为指定构造器(designated initializers)。
由于我们还没有介绍继承,因此本章只介绍横向代理。
将上一节的示例修改如下:

  1. class Rectangle {
  2. var width : Double
  3. var height : Double
  4. init(width : Double, height : Double) { ①
  5. self.width   = width
  6. self.height  = height
  7. }
  8. init(W width : Double,H height : Double) {  ②
  9. self.width   = width
  10. self.height  = height
  11. }
  12. convenience init(length : Double) { ③
  13. self.init(W : length, H : length)
  14. }
  15. convenience init() {    ④
  16. self.init(width: 640.0, height: 940.0)
  17. }
  18. }
  19. var rectc1 = Rectangle(width : 320.0, height : 480.0)   ⑤
  20. println("长方形:\(rectc1.width) x \(rectc1.height)")
  21. var rectc2 = Rectangle(W : 320.0, H : 480.0)    ⑥
  22. println("长方形:\(rectc2.width) x \(rectc2.height)")
  23. var rectc3 = Rectangle(length: 500.0)   ⑦
  24. println("长方形3:\(rectc3.width) x \(rectc3.height)")
  25. var rectc4 = Rectangle()    ⑧
  26. println("长方形4:\(rectc4.width) x \(rectc4.height)")

将Rectangle声明为类,其中也有4个构造器重载。在第③行和第④行的构造器中使用了self.init语句,并且在构造器前面加上了convenience关键字,convenience表示便利构造器,这说明我们定义构造器是横向代理调用其他构造器。

第③行的self.init(W : length, H : length)语句是在横向调用第②行定义的构造器代理,第④行的self.init(width: 640.0, height: 940.0)语句是在横向调用第①行定义的构造器代理。

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台

Swift构造器重载的更多相关文章

  1. 008-Scala主构造器、私有构造器、构造器重载实战详解

    008-Scala主构造器.私有构造器.构造器重载实战详解 Scala主构造器实战 无参数的主构造器 分析 1.name 需要赋初值,一般通过占位符来代表空值 2.private 声明私有的age 生 ...

  2. 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

    一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...

  3. Scala主构造器、私有构造器、构造器重载

    Scala中的主构造器跟在定义类的时候声明类名之后 如下: class scala(arg : String) { // } private[this] 修饰该字段只能被当前所对应的对象所访问,其他对 ...

  4. 8、java高级面向对象-重载、构造器重载、初始化块、this、super、对象构造和初始化分析、覆盖、toString

    1.方法的重载(overload) 同一个类中同时存在一个以上的同名函数,参数个数或类型不同或顺序不同,称为方法的重载. 和返回值无关! 构造器重载:非默认构造器和默认构造器其实就是方法的重载. 2. ...

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

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

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

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

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

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

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

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

  9. 再议Swift操作符重载

    今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又 ...

随机推荐

  1. hdu3001 Travelling

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. QRadioButton类中Toggled()信号的使用方法

    QRadioButton类中Toggled()信号的使用方法 1.说明 QRadioButton中,Toggled()信号是在Radio Button状态(开.关)切换时发出的,而clicked()信 ...

  3. 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。

    1. 拍照裁剪后 点击EditText会弹出输入法,却不能输入.可是点击点一EdtiText就能够输入了,所以我就写了一个看不见的EdtiText,切换焦点,这样就攻克了这个奇怪的这问题,应该是and ...

  4. 一个奇怪的html上url参数问题

    今天踩了一个坑  如xxx.com/xxx/xxx?code=+adfdf  我需要拿到 code=+adfdf 但是后台拿到的是 adfdf, 后来只能对 code的值进行 urlencode处理了

  5. HDU 5538 L - House Building 水题

    L - House Building Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...

  6. 通过ulimit改善linux系统性能(摘自IBM)

    本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 用法.通过这篇文章,读者不仅能够了解 ulimit 所起的作用.而且能够学会怎样更好地通过 ulimit 限制资源的使 ...

  7. 第1章 游戏之乐——NIM(3)两堆石头的游戏

    NIM(3)两堆石头的游戏 1. 问题描述 假设有两堆石头,有两个玩家会根据如下的规则轮流取石头:每人每次可以从两堆石头中各取出数量相等的石头,或者仅从一堆石头中取出任意数量的石头:最后把剩下的石头一 ...

  8. Computer Science Theory for the Information Age-2: 高维空间中的正方体和Chernoff Bounds

    高维空间中的正方体和Chernoff Bounds 本文将介绍高维空间中正方体的一些性质,以及一个非常常见也是非常有用的概率不等式——Chernoff Bounds. 考虑$d$维单位正方体$C=\{ ...

  9. CentOS 安装中文输入法

    转载:http://blog.sina.com.cn/s/blog_9f1c093101019h03.html centos 6.3用yum安装中文输入法 1.需要root权限,所以要用root登录 ...

  10. Sky number

    描述 key 天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进 制数BB0,其四位数字之和也为22,同时 ...