zoukankan      html  css  js  c++  java
  • Swift中的参数内部名称和外部名称

    1.什么是参数的内部名称和外部名称?

    struct Color {
        let red, green, blue: Double
        
        init(red redColor: Double,green greenColor: Double,blue blueColor: Double) {
            red = redColor
            green = greenColor
            blue = blueColor
        }
    }

    1.1  Color这个结构体的构造方法中提供了三个参数,其中red是第一个参数的外部名称,redColor是第一个参数的内部名称;同理green和blue分别是第二、三个参数的外部名称,greenColor和blueColor分别是第二、三个参数的内部名称。外部名称在创建实例时的提示中显示,内部名称只能在构造方法内部使用,两个名称指的是同一个参数。在创建实例时会显示外部名称截图:

    1.2  如果只有参数的内部名称,没有外部名称,编译器会自动为参数创建一个和内部名称相同的外部名称。看实例:

     

    这个只有一个参数的构造函数的外部参数名称和内部参数名称相同。

    1.3  内部参数名称可以用来区分是传入的参数还是实例的属性,也可以用self来区分

    struct Color {
        let red, green, blue: Double
        
        init(RED redColor: Double,GREEN greenColor: Double,BLUE blueColor: Double) {
            red = redColor
            green = greenColor
            blue = blueColor
        }
        
        init(white: Double) {
            red = white
            green = white
            blue = white
        }
        
        init(red: Double,green: Double,blue: Double) {
            self.red = red
            self.green = green
            self.blue = blue
        }
    }

    1.4  编译器根据外部参数名称去检查构造器是重载还是重名的。 

    1.5  如果不希望提供参数的外部名称,可以用_显示代替参数的外部名称,创建实例的时候,编译器会显示参数的内部名称。

    struct Color {
        let red, green, blue: Double
        
        init(red redColor: Double,green greenColor: Double,blue blueColor: Double) {
            red = redColor
            green = greenColor
            blue = blueColor
        }
        
        init(white: Double) {
            red = white
            green = white
            blue = white
        }
    
        init(_ red1: Double,_ green1: Double,_ blue1: Double) {
            self.red = red1
            self.green = green1
            self.blue = blue1
        }
        
    }

    2.类的构造器和结构体构造器的区别

    实体类的构造器,定义普通类型的属性时,必须初始化(声明时就初始化或者在构造函数中初始化),如果不初始化会报错。可选类型的属性可以不初始化,因为可选类型不初始化的时候,默认值时nil。

    结构体的构造器,普通类型和可选类型的属性均可不初始化,编译器会默认提供一个带全参的构造器,这个构造器实体类是没有的。如果结构体中有普通类型的属性未初始化,则编译器不会提供结构体名称+括号的默认构造器,只会提供一个带全参的构造器,这样避免创造一个未初始化过的结构体。

    实体类构造器:

    class ShoppingListItem {
        var name: String?
        var quantity: String?
        var purchased: String?
    }

    以上构造器默认全部初始化为nil,所以编译器会默认提供一个ShoppingListItem()的构造器,也可以在类中添加其他构造器从而让编译器提供其他的构造器。默认构造器截图:

    结构体构造器:

    a.结构体声明中有未初始化的属性

    struct Car {
        var name: String?
        var quantity: Int
        var purchased: String?
    }

    编译器默认只提供全参的构造器:

    b.结构体声明中没有未初始化的属性

    struct Car {
        var name: String?
        var quantity: String?
        var purchased: String?
    }

    编译器会提供2个默认的构造器:

    3.类的指定构造器和便利构造器(构造器中属性前有没有self.结果都是一样,属性名前面默认会自带self.)

    3.1  指定构造器的作用就是为了初始化属性值,便利构造器需要添加关键字convenience,并且便利构造器无法直接访问属性,必须通过指定构造器间接访问

    class Food {
        var name: String
        
        //指定构造器
        init(name: String) {
            self.name = name
        }
        
        //便利构造器
        convenience init() {
            self.init(name: "[Unnamed]")
            //name = "CCC"   //会报错
        }
    }
  • 相关阅读:
    MySQL事务知识要点(一)
    MySQL 安全体系知识要点
    MySQL 安全性知识要点
    #翻译#通往SQL Server安全级别2的阶梯:身份验证; 唐•吉利; 原文链接:Stairway to SQL Server Security Level 2: Authentication http://www.sqlservercentral.com/articles/Stairway+Series/109975/
    SQL子查询&视图&更新&删除思维导图-误点难点(附示例代码)
    #翻译#通往t
    香港中文大学-人脸识别进展-2014-06
    NotesMITLinearAlgebra
    Notes Berkerly Statistics 2.1X Week4
    Notes on Brain Study
  • 原文地址:https://www.cnblogs.com/wobuyayi/p/6400672.html
Copyright © 2011-2022 走看看