🔸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 convenience init,然後將真正初始化的工作交給自己的 required init:
但千萬不能用 required init (require designated initializer),然後將初始化的工作交給自己的另一個 required init❗
當子類別 1️⃣ 沒有新屬性 2️⃣ 也不需修改父類別的初始化邏輯時,則不需實作自己的 required init,用繼承來的就可以了。
Last updated
Was this helpful?