🔸required initializer
╱🚧 under construction -> subclass, override, designated initializer, inherited initializer, convenience init
swift ⟩ type ⟩ init ⟩ initializers ⟩ required
1️⃣ write required before the definition of a class initializer to indicate that every subclass of the class must implement that initializer. ( 👉 💈範例 (1) )
2️⃣ write required before every subclass implementation of a required initializer, don’t write override when overriding a required designated initializer.
You don’t have to provide an explicit implementation of a required initializer if you can satisfy the requirement with an inherited initializer. ( 👉 💈範例 (2) )
// superclass
class SuperClass {
required init() { ... } // 1️⃣ required (designated) init
}
// subclass
class Subclass: SuperClass {
required init() { ... } // 2️⃣ required init (No `override` here❗️)
}下面的例子說明:如果 subclass 沒有提供 required init 會發生什麼錯誤,以及如何解決它。
// superclass
class BasePoint {
var x: Double
var y: Double
// ⭐️ required (designated) init
required init(x: Double, y: Double) {
self.x = x
self.y = y
}
}
// subclass
class ColoredPoint: BasePoint {
var color: String
// ⛔ error: 'required' initializer 'init(x:y:)' must be provided
// by subclass of 'BasePoint'.
// required (designated) init
required init(x: Double, y: Double, color: String = "black") {
self.color = color
super.init(x: x, y: y)
}
}我們可以在 subclass 提供一個 required init (require designated initializer),來解決這個問題:
// 方法一:required designated init
// ⭐️ subclass must implement required init
required init(x: Double, y: Double) {
self.color = "black" // ⭐️ init self's properties first
super.init(x: x, y: y) // ⭐️ init super's properties next
}或者也可以提供一個 required convenience init,然後將真正初始化的工作交給自己的 required init:
// 方法二:required convenience init
required convenience init(x: Double, y: Double) {
// ⭐️ delegates to self's required init
self.init(x: x, y: y, color: "black")
}但千萬不能用 required init (require designated initializer),然後將初始化的工作交給自己的另一個 required init❗
// required (designated) init but delegates❗
required init(x: Double, y: Double) {
// ⛔ error:
// designated initializer cannot delegate (with 'self.init')
self.init(x: x, y: y, color: "black")
}當子類別 1️⃣ 沒有新屬性 2️⃣ 也不需修改父類別的初始化邏輯時,則不需實作自己的 required init,用繼承來的就可以了。
// BaseClass
class BaseClass {
var x: Int
var y: Int
required init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
// SubClass
class SubClass: BaseClass {
// ⭐️ 子類別沒有新屬性,不需實作 `required init`。
func idle() { /* do nothing */ }
}
let obj = SubClass(x: 10, y: 20)
print(obj.x) // 10
print(obj.y) // 20Last updated
Was this helpful?