当前位置: 首页 > 编程笔记 >

Swift学习笔记之构造器重载

董喜
2023-03-14
本文向大家介绍Swift学习笔记之构造器重载,包括了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学习笔记之元组(tuples),包括了Swift学习笔记之元组(tuples)的使用技巧和注意事项,需要的朋友参考一下 元组 元组(tuples)是由其它类型组合而成的类型。元组可能包含零或多个类型,比如 字符串、整数、字符、布尔以及其它元组。同时请注意,元组是值传递,而不是引用。 在Swift中创建元组的方式很简单,元组类型是用括号包围,由一个逗号分隔的零个或多个类型的列

  • 本文向大家介绍Javascript学习笔记之数组的构造函数,包括了Javascript学习笔记之数组的构造函数的使用技巧和注意事项,需要的朋友参考一下 数组的构造函数 由于数组的构造函数在处理参数时的不确定性,因此强烈建议使用 [] 符号来创建一个新数组。 当只有一个参数被传递到数组的构造函数中,并且这个参数还是一个数字时,构造函数将会返回一个元素值为 undefined 的数组,而且这个数组的

  • 本文向大家介绍Javascript学习笔记之函数篇(五) : 构造函数,包括了Javascript学习笔记之函数篇(五) : 构造函数的使用技巧和注意事项,需要的朋友参考一下 Javascript 中的构造函数与其他语言相比也是不同的。任何通过关键字 new 调用的函数都可以当做构造函数。 在构造函数体内,this 指向新创建的对象。如果构造函数体内没有显示的 return 表达式,那么我们就

  • 本文向大家介绍JavaScript学习笔记之数组去重,包括了JavaScript学习笔记之数组去重的使用技巧和注意事项,需要的朋友参考一下 推荐阅读:JavaScript学习笔记之数组的增、删、改、查 JavaScript学习笔记之数组求和方法 JavaScript学习笔记之数组随机排序 话说面试常会碰到面试官会问JavaScript实现数组去重的问题,最近刚好在学习有关于JavaScript数组

  • 机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。 源码:https://www.wenjiangs.com/wp-content/uploads/2022/12/ML_Notes.zip

  • 本文向大家介绍java基础学习笔记之类加载器,包括了java基础学习笔记之类加载器的使用技巧和注意事项,需要的朋友参考一下 类加载器 java类加载器就是在运行时在JVM中动态地加载所需的类,java类加载器基于三个机制:委托,可见,单一。 把classpath下的那些.class文件加载进内存,处理后成为字节码,这些工作是类加载器做的。 委托机制指的是将加载类的请求传递给父加载器,如果父加载器找