1. 程式人生 > >Swift學習筆記十四:構造(Initialization)

Swift學習筆記十四:構造(Initialization)

array -o 默認值 shee 狀態 servers 輸入 告訴 nil

? ? ?類和結構體在實例創建時,必須為全部存儲型屬性設置合適的初始值。

存儲型屬性的值不能處於一個未知的狀態。
? ? ?你能夠在構造器中為存儲型屬性賦初值,也能夠在定義屬性時為其設置默認值。下面章節將具體介紹這兩種方法。
註意:

? ? ?當你為存儲型屬性設置默認值或者在構造器中為其賦值時,它們的值是被直接設置的。不會觸發不論什麽屬性觀測器(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 須要立馬運行此閉包,否則會把閉包本身作為值賦值給了屬性



Swift學習筆記十四:構造(Initialization)