Swift构造器重载

简介: <span style="font-size:14px;">与函数一样,方法也存在重载,其重载的方式与函数一致。那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的。<br>一、构造器重载概念<br>Swift中函数重载的条件也适用于构造器,条件如下:<br>函数有相同的名字;<br>参数列表不同或返回值类型不同,或外部参数名不同;<br>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课堂微信公共平台


目录
相关文章
|
存储 安全 Swift
Swift5.1—指定构造器和便利构造器
Swift5.1—指定构造器和便利构造器
548 0
Swift5.1—指定构造器和便利构造器
Swift5.1—必要构造器
Swift5.1—必要构造器
123 0
|
安全
Swift5.1—构造器的自动继承
Swift5.1—构造器的自动继承
182 0
《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式
<div style="top: 0px;"></div> <span style="font-family:宋体;font-size:14px;"></span><p style="margin: 0cm 0cm 0pt; mso-outline-level: 1;"><span lang="EN-US" style="font-family:'Arial',sans-serif;fon
1366 0
|
Swift
Swift构造器(Initializer)与析构器(Deinitializer)
<div> <p><span style="font-size:14px;">为了初始化结构体和类等类型的实例属性。</span></p> <p><span style="font-size:14px;">默认构造器</span></p> <p><span style="font-size:14px;"></span></p> <pre name="code" class="html">str
1121 0
|
5月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
157 3
|
10天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
19 2
|
26天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
47 1

相关课程

更多