zoukankan      html  css  js  c++  java
  • 《从零开始学Swift》学习笔记(Day 39)——构造函数重载

    原创文章,欢迎转载。转载请注明:关东升的博客 

    构造函数作为一种特殊方法,也可以重载。

    Swift中构造函数可以多个,他们参数列表和返回值可以不同,这些构造函数构成重载。

    示例代码如下:

    class Rectangle {   
    
        var  Double
    
        var height: Double   
    
        init( Double, height: Double) {
    
            self.width   = width
    
            self.height  = height
    
        }   
    
        init(W  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( 320.0, height: 480.0) 
    
    print("长方形:(rectc1.width) x (rectc1.height)") 
    
    var rectc2 = Rectangle(W: 320.0, H: 480.0)          
    
    print("长方形:(rectc2.width) x (rectc2.height)") 
    
    var rectc3 = Rectangle(length: 500.0)               
    
    print("长方形3:(rectc3.width) x (rectc3.height)") 
    
    var rectc4 = Rectangle()                        
    
    print("长方形4:(rectc4.width) x (rectc4.height)") 

    构造函数代理

    为了减少多个构造函数间的代码重复,在定义构造函数时,可以通过调用其他构造函数来完成实例的部分构造过程,这个过程称为构造函数代理。构造函数代理在结构体和类中使用方式是不同,先介绍结构体中构造函数代理。

    将上一节的示例修改如下:

    struct Rectangle {
    
     
    
        var  Double
    
        var height: Double
    
       
    
        init( Double, height: Double) {
    
            self.width   = width
    
            self.height  = height
    
        }
    
       
    
        init(W  Double,H height: Double) { 
    
            self.width   = width
    
            self.height  = height
    
        }
    
       
    
        init(length: Double) {                    //调用了self.init语句
    
            self.init(W: length, H: length)
    
        }
    
     
    
        init() {                              //调用了self.init语句
    
            self.init( 640.0, height: 940.0)
    
        }
    
     
    
    }
    
     
    
    var rectc1 = Rectangle( 320.0, height: 480.0) 
    
    print("长方形:(rectc1.width) x (rectc1.height)")
    
     
    
    var rectc2 = Rectangle(W: 320.0, H: 480.0)          
    
    print("长方形:(rectc2.width) x (rectc2.height)")
    
     
    
    var rectc3 = Rectangle(length: 500.0)               
    
    print("长方形3:(rectc3.width) x (rectc3.height)")
    
     
    
    var rectc4 = Rectangle()                        
    
    print("长方形4:(rectc4.width) x (rectc4.height)")

    将Rectangle声明为结构体类型,其中也有4个构造函数重载。

    这种在同一个类型中通过self.init语句进行调用当前类型其它构造函数,其它构造函数被称为构造函数代理。

    类构造函数横向代理

    由于类有继承关系,类构造函数代理比较复杂,分为横向代理和向上代理。

    q 横向代理类似于结构体类型构造函数代理,发生在同一类内部,这种构造函数称为便利构造函数(convenience initializers)。

    q 向上代理发生在继承情况下,在子类构造过程中要先调用父类构造函数,初始化父类的存储属性,这种构造函数称为指定构造函数(designated initializers)。

    将上面的示例修改如下:

    class Rectangle {
    
     
    
        var  Double
    
        var height: Double
    
       
    
        init( Double, height: Double) {    
    
            self.width   = width
    
            self.height  = height
    
        }
    
       
    
        init(W  Double,H height: Double) {     
    
            self.width   = width
    
            self.height  = height
    
        }
    
       
    
        convenience init(length: Double) {           
    
            self.init(W: length, H: length)
    
        }
    
     
    
        convenience init() {                     
    
            self.init( 640.0, height: 940.0)
    
        }
    
     
    
    }
    
     
    
    var rectc1 = Rectangle( 320.0, height: 480.0) 
    
    print("长方形:(rectc1.width) x (rectc1.height)")
    
     
    
    var rectc2 = Rectangle(W: 320.0, H: 480.0)          
    
    print("长方形:(rectc2.width) x (rectc2.height)")
    
     
    
    var rectc3 = Rectangle(length: 500.0)               
    
    print("长方形3:(rectc3.width) x (rectc3.height)")
    
     
    
    var rectc4 = Rectangle()                        
    
    print("长方形4:(rectc4.width) x (rectc4.height)")

    将Rectangle声明为类,其中也有4个构造函数重载。

    欢迎关注关东升新浪微博@tony_关东升。
    关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
                              ​
    更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
    智捷课堂论坛网站:http://51work6.com/forum.php

  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/4987686.html
Copyright © 2011-2022 走看看