Swift Initialization (1) — Default Initializer

Racing Wang
17LIVE Tech Insight
5 min readJul 25, 2020

初始化(Initialization)在程式語言中如同一顆生命之樹,是萬物的起源,掌握好初始化的技巧便能主宰這個世界。然而,翻開 Swift 字典書中的 Initialization 篇章,一拖拉庫的 Initializer 想必讓大家感到十分困惑,究竟每個 Initializer 的差別與用途分別是什麼?我將它們整理成四個類別並會透過數篇文章一一向大家介紹。

Swift Initialization (1) — Default Initializer

Swift Initialization (2) — Initializer Delegation

Swift Initialization (3) — Two-Phase Initialization

The Mission of Initializers

在開始介紹每一種 Initializer 以前,有一個非常重要的觀念必須要先釐清 — 究竟 Initializer 的主要任務是什麼?

與 Objective-C 不同,Swift 的 Non-Optional Stored Property 若在宣告時沒有指派預設值的話便不會有預設值,因此 Initializer 的使命就是確保實體化完成後,所有的 Stored Property 都初始化完畢,白話一點來說就是:

確保所有 Stored Property 都完成首次賦值

確保所有 Stored Property 都完成首次賦值

確保所有 Stored Property 都完成首次賦值

這個觀念很重要,因此要說三次,只要心中牢記著這件事,就不難理解為何這麼多的 Initialzer 都有各自的規則。

對 Stored Property 進行首次賦值

要對 Stored Property 進行首次賦值有兩種方式。第一種是在宣告時指派預設值:

struct Company {
let name = "17 Media"
let employee = 500
}

第二種是透過 Initializer 賦值:

struct Company {
let name: String
let employee: Int
init(name: String, employee: Int) {
self.name = name
self.employee = employee
}
}

看到這裏大家一定會想:這件事情我早就知道了!是的,但呼應上一段提到 Initializer 的重要使命,必須確保大家都清楚這是首次賦值的唯二手段。下面讓我們正式開始介紹第一種 Initializer — Default Initializer。

Default initializer

顧名思義,也就是預設的 Initializer,當在符合若干條件時會產生 Default Initializer,針對 Class 和 Struct 會有不同的條件。

Default initializer for class

  1. 它是一個 Root Class
  2. 沒有宣告任何 Designated Initializer
  3. 所有 Store Property 在宣告時都有指派預設值

首先,Class 的 Default Initializer 只會發生在 Root Class,因為 Subclass 的 Initializer 只會由自動繼承、覆寫(Override)或自定義而來,所以不會擁有 Default Initializer,關於 Class Inheritance and Initialize 會在之後的文章中說明。條件二的 Designated Initializer 一樣會在之後的文章中深入探討,大家可以先知道它是 Class 主要的 Initializer,與它相對的 Convenience Initializer 屬於次要的 Initializer,若只是宣告 Convenience Initializer 不會影響該條件。滿足以上三項條件便會自動產生一個沒有 Argument Label 的 Default Initializer:

class Food {
let name = "Egg"
let price = 8
var description: String? // Default Value is nil
}
// Default Initializer
let myFood = Food()

值得一提的是,Optional Value 在沒有指派預設值情況下,默認預設值為 nil,因此符合條件三。

Default initializer for struct

Struct 的 Default Initializer 也稱作 Memberwise Initializer,意指 Argument Label 會列舉出所有 Stored Property 的名稱。只要 — 未宣告任何 Initializer — 時便會自動產生 Memberwise Initializer,例如:

struct Point {
let x: Float
let y: Float
}
// Memberwise Initializer
let myPoint = Point(x: 20, y: 30)

與 Class 最不同的是,Struct 不管有沒有為 Stored Property 指派預設值都會產生 Memberwise Initializer。

Default Initializer 就介紹到這,接下來的幾篇文章會陸續對 Initializer Delegation、Two-Phase Initialization、Class Inheritance and Initialize 以及其它幾種 Initializer 進行說明,盡請期待!

--

--