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"   //会报错
        }
    }
  • 相关阅读:
    函数
    python操作文件
    POJ-2689-Prime Distance(素数区间筛法)
    POJ-2891-Strange Way to Express Integers(线性同余方程组)
    POJ-2142-The Balance
    POJ-1061-青蛙的约会(扩展欧几里得)
    Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing
    Educational Codeforces Round 75 (Rated for Div. 2) C. Minimize The Integer
    Educational Codeforces Round 75 (Rated for Div. 2) B. Binary Palindromes
    Educational Codeforces Round 75 (Rated for Div. 2) A. Broken Keyboard
  • 原文地址:https://www.cnblogs.com/wobuyayi/p/6400672.html
Copyright © 2011-2022 走看看