类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值。

存储型属性的值不能处于一个未知的状态。
     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值。下面章节将具体介绍这两种方法。
注意:

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

一、基本的语法

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

重点:
     ① 构造函数使用initkeyword
     ② 一个类或者结构体中构造函数能够有多个,可是他们參数必须不一样(參数名称或者个数不一样)
     ③ 带參数的构造函数。默认參数名为外部參数名。调用时须要带上參数名,如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 keyword定义,指定构造器不适用不论什么东西
     ② 便利构造器必须要调用指定构造器,否则编译器会报错

四、继承与构造

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 须要立马运行此闭包,否则会把闭包本身作为值赋值给了属性