首页 > 代码库 > Swift学习笔记十四:构造(Initialization)

Swift学习笔记十四:构造(Initialization)

     类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。
     你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值。以下章节将详细介绍这两种方法。
注意:

     当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property observers)。

一、基本语法

class Human{
    var name :String
    init(){
        name = "human"
    }
    init(name:String){
        self.name = name;
    }
}
var a = Human(name:"小笨狼")

重点:
     ① 构造函数使用init关键字
     ② 一个类或者结构体中构造函数可以有多个,但是他们参数必须不一样(参数名称或者个数不一样)
     ③ 带参数的构造函数,默认参数名为外部参数名,调用时需要带上参数名,如Human(name:"小笨狼")
     ④ 类和结构体必须为所有存储属性赋予初始值,初始值可以在定义时,或者构造函数中赋予
     ⑤ 当为储存属性设置初始值时,不会触发任何观察器
     ⑥ 若属性类型为可选类型,则初始值默认为nil。这时候可以不手动赋值
     ⑦ 对于常量属性,也可以在构造函数中赋值,如本例中self.name = name;

二、默认构造器
     Swift 将为所有属性已提供默认值的且自身没有定义任何构造器的结构体或基类,提供一个默认的构造器。

class Human{
    var name :String?
}
var a = Human() //这时候初始化调用的是默认构造器,编译器会自动生成一个构造器,将name=nil

struct Student{
    let name:String?
    let score = 0
}
var b = Student(name:"小笨狼",score:10) //结构体默认构造器是逐一成员构造器

重点:
     ① 对于类,默认构造器是普通构造器,调用时不需要输入任何参数,构造器会将默认值赋予给属性
     ② 对于结构体,默认构造器是逐一成员构造器,初始化时需要传入初始值,如:Student(name:"小笨狼",score:10)

三、 便利构造器和指定构造器
     指定构造器是类中最主要的构造器。每个类中至少拥有一个指定构造器。便利构造器是类中比较次要的、辅助型的构造器。类中可以没有便利构造器

class Human{
    var name :String?
    init(name:String){      //指定构造器
        self.name = name
    }
    convenience init(){     //便利构造器  
        self.init(name:"小笨狼")
    }
}

重点:
     ① 便利构造器使用convenience 关键字定义,指定构造器不适用任何东西
     ② 便利构造器必须要调用指定构造器,否则编译器会报错

四、继承与构造

class Student:Human{
    var score:Int
    init(name: String,score:Int){
        self.score = score
        super.init(name:name)
    }
    convenience init() {
        self.init(name:"小笨狼",score:98)
    }
}

重点:
     ① 指定构造器必须要调用父类构造器
     ② 指定构造器必须先将本类中新属性赋值,再调用父类构造器

四、通过闭包来设置默认值
     如果某个存储型属性的默认值需要特别的定制或准备,你就可以使用闭包或全局函数来为其属性提供定制的默认值。

class student{
    var score:Int[] = {
        var scores:Int[] = Array()
        for m in 0...3{
                scores.append(m)
            }
            return scores
    }()
}

     score的默认值是一个数组,为了设置这个数组,需要使用一个for循环,这时候就可以使用闭包,在闭包中设置这个数组。来设置默认值
注意:
     ① 闭包后需要加(),这是用来告诉 Swift 需要立刻执行此闭包,否则会把闭包本身作为值赋值给了属性