Swift学习笔记之构造器重载

 更新时间:2014年11月18日 15:01:04   投稿:hebedich  
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中的泛型支持与使用

    支持泛型意味着可以在规定参数类型的情况下更灵活地编写程序,也是Swift语言先进而又强大的体现,这里我们就来解析Swift中的泛型支持与使用:
    2016-07-07
  • Swift中用到extension的一些基本的扩展功能讲解

    Swift中用到extension的一些基本的扩展功能讲解

    这篇文章主要介绍了Swift的一些基本的扩展功能,即extension关键字的使用,需要的朋友可以参考下
    2015-11-11
  • Swift学习教程之SQLite的基础使用

    Swift学习教程之SQLite的基础使用

    这篇文章主要给大家介绍了关于Swift学习教程之SQLite的基础使用,文中通过示例代码介绍的非常详细,对大家学习或者使用Swift SQLite具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • SwiftUI中TabView组件的常规使用

    SwiftUI中TabView组件的常规使用

    这篇文章主要给大家介绍了关于SwiftUI中TabView组件的常规使用,文中通过实例代码介绍的非常详细,对大家学习或者使用SwiftUI具有一定的参考学习价值,需要的朋友可以参考下
    2022-06-06
  • Swift方法调度之类的普通方法底层探究

    Swift方法调度之类的普通方法底层探究

    这篇文章主要介绍了Swift-方法调度-类的普通方法底层探究,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Swift心得笔记之控制流

    Swift心得笔记之控制流

    控制流(Control Flow)我不想这么译的。。。我更想叫控制语句,但是想想,这么叫也没错,意指流程控制。大部分用法跟C类似。
    2015-04-04
  • swift自定义表格控件(UITableView)

    swift自定义表格控件(UITableView)

    这篇文章主要为大家详细介绍了swift自定义表格控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • SwiftUI学习之state和Binding的区别浅析

    SwiftUI学习之state和Binding的区别浅析

    这篇文章主要给大家介绍了关于SwiftUI学习之state和Binding区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • mac git xcrun error active developer path 错误

    mac git xcrun error active developer path 错误

    本文主要是讲诉了如何解决在mac下使用git;xcode4.6的环境时,出现了错误(mac git xcrun error active developer path)的解决办法,希望对大家有所帮助
    2014-09-09
  • Swift网络请求库Alamofire使用详解

    Swift网络请求库Alamofire使用详解

    这篇文章主要为大家详细介绍了Swift网络请求库Alamofire的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论