Swift构造器重载

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

class Rectangle {

    var width : Double
    var height : Double

    init(width : Double, height : Double) {	①
        self.width   = width
        self.height  = height
    }

    init(W width : Double,H height : Double) {	②
        self.width   = width
        self.height  = height
    }

    init(length : Double) {	③
        self.width   = length
        self.height  = length
    }

    init() {						④
        self.width   = 640.0
        self.height  = 940.0
    }

}

var rectc1 = Rectangle(width : 320.0, height : 480.0)	⑤
println("长方形:\(rectc1.width) x \(rectc1.height)")

var rectc2 = Rectangle(W : 320.0, H : 480.0)	⑥
println("长方形:\(rectc2.width) x \(rectc2.height)")

var rectc3 = Rectangle(length: 500.0)	⑦
println("长方形3:\(rectc3.width) x \(rectc3.height)")

var rectc4 = Rectangle()	⑧
println("长方形4:\(rectc4.width) x \(rectc4.height)")

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

struct Rectangle {

    var width : Double
    var height : Double

    init(width : Double, height : Double) {	①
        self.width   = width
        self.height  = height
    }

    init(W width : Double,H height : Double) {	②
        self.width   = width
        self.height  = height
    }

    init(length : Double) {	③
        self.init(W : length, H : length)
    }

    init() {						④
        self.init(width: 640.0, height: 940.0)
    }

}

var rectc1 = Rectangle(width : 320.0, height : 480.0)	⑤
println("长方形:\(rectc1.width) x \(rectc1.height)")

var rectc2 = Rectangle(W : 320.0, H : 480.0)	⑥
println("长方形:\(rectc2.width) x \(rectc2.height)")

var rectc3 = Rectangle(length: 500.0)	⑦
println("长方形3:\(rectc3.width) x \(rectc3.height)")

var rectc4 = Rectangle()	⑧
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)。
由于我们还没有介绍继承,因此本章只介绍横向代理。
将上一节的示例修改如下:

class Rectangle {

    var width : Double
    var height : Double

    init(width : Double, height : Double) {	①
        self.width   = width
        self.height  = height
    }

    init(W width : Double,H height : Double) {	②
        self.width   = width
        self.height  = height
    }

    convenience init(length : Double) {	③
        self.init(W : length, H : length)
    }

    convenience init() {	④
        self.init(width: 640.0, height: 940.0)
    }

}

var rectc1 = Rectangle(width : 320.0, height : 480.0)	⑤
println("长方形:\(rectc1.width) x \(rectc1.height)")

var rectc2 = Rectangle(W : 320.0, H : 480.0)	⑥
println("长方形:\(rectc2.width) x \(rectc2.height)")

var rectc3 = Rectangle(length: 500.0)	⑦
println("长方形3:\(rectc3.width) x \(rectc3.height)")

var rectc4 = Rectangle()	⑧
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课堂微信公共平台

时间: 2024-08-05 14:24:53

Swift构造器重载的相关文章

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

一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同时这这里我们需要注意以下两点:  A.方法重载与返回值类型没有任何关系;  B.方法重载与是否有static修饰没有任何关系. 那我们如何才能确定到底调用的哪个方法呢?  A.主调者:明确是谁在调用这个方法,是类还是对象  B.方法名和形参:确定调用哪个方法(由方法名和形参共同决定) 例1: 1 p

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

为了初始化结构体和类等类型的实例属性. 默认构造器 [html] view plaincopy struct Fahrenheit { var temperature: Doubleinit(){ temperature = 32.0 } } var f = Fahrenheit() //调用默认构造器 init() ,没有参数 没有返回值. [html] view plaincopy println("The default temperature   is \(f.temperature)°

Swift 构造器探究

Swift 构造器探究 什么时候要用构造器? 对于类(Class) 其实在其他语言中,比如说Java对于属性的初始化没有严格的要求.甚至在Model层只有对应属性的get,set访问器.而在Swift中无论是对于结构体(Structure)还是类(Class),如果其中存在存储属性(stored property),那么必须在合适的地方给它赋初始值,也就是初始化.不能让它们成为不确定的状态,即没有初始化.关于初始化,Swift提供了两种方式.一种是属性定义的时候初始化,也就是赋默认值. 第二种是

构造器重载

一.构造器重载概念 函数重载概念也适用于构造器,条件如下: 1.函数有相同的名字' 2.参数列表不同或返回值类型不同: 构造器满足以下2个条件: class Rectangle{                 var width:Double                 var height:Double                 init(width:Double,height:Double){                     self.width=width       

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

008-Scala主构造器.私有构造器.构造器重载实战详解 Scala主构造器实战 无参数的主构造器 分析 1.name 需要赋初值,一般通过占位符来代表空值 2.private 声明私有的age 生成的getter/setter方法也是私有的;不加则私有的age生成公有的getter/setter方法 3.private[this] 表示是只属于当前的实例本身,别人无法通过实例访问,也就是说再实例化对象也不可以访问此属性 4.def定义辅助构造器(重载构造器),其他的重载构造器必须调用主构造器

构造器重载之简写

this 1 public class Apple 2 { 3 public String name; 4 public String color; 5 public double weight; 6 public Apple(){} 7 // 两个参数的构造器 8 public Apple(String name , String color) 9 { 10 this.name = name; 11 this.color = color; 12 } 13 // 三个参数的构造器 14 publ

再议Swift操作符重载

今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又臭又长.而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣. 谨 慎引入,按需使用.比如在连接两个字串的时候你就可以通过重载加法来实现.甚至于你仅在屏幕上输入一个加号,就能响应一个网络链接.播放一段音乐或者完成 你能实现的其他任何功能.然而过于复杂的功能对编码来说简直就

学习Swift -- 构造器(下)

构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满足某种必要的条件等. 为了妥善处理这种构造过程中可能会失败的情况.你可以在一个类,结构体或是枚举类型的定义中,添加一个或多个可失败构造器.其语法为在init关键字后面加添问号(init?). 可失败构造器,在构建对象的过程中,创建一个其自身类型为可选类型的对象.你通过re

Swift函数重载

1.函数重载的概念 函数的重载指的是多个函数享有相同的名字都是有不同的参数或返回值类型不同,它们互相成为重载关系, 2.与其它语言的不同 Swift函数的参数类型包含了参数列表类型和返回值类型,例如(Double,Double)->Double 是由2个Double类型参数列表和Double类型的返回值类型构成,也就是说Swift中函数名相同,参数列表不同或者返回值类型不同的函数都可以构成重载,而在C++或者JAVA中,函数的重载只是与参数列表有关系,与返回值没有关系 3.示例 func rec