Problem
Override
a convenience initializer of a subclass and it produces a compile error.
Detail
I am having issues understanding why Swift (v4.1) is not letting me override my convenience initializer. Reading the documentation I found that these two rules apply to my question:
Rule 1 If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.
Rule 2 If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.
In the code below I fall under the first rule and all my convenience initializers are inherited into ClassB
. Furthermore, since I inherited all the designated initializers as per rule one, I also get all my convenience initializers inherited.
class ClassA<T> {
// This array would be private and not visible from ClassB
var array: [T]?
init() { }
convenience init(array: [T]) {
self.init()
self.array = array
}
}
class ClassB<T>: ClassA<T> {
var anotherArray: [T]?
// I feel like I should include the "override" keyword
// but I get a compiler error when "override" is added before "convenience init".
convenience init(array: [T]) {
self.init()
self.anotherArray = array
}
}
// Works fine
let instanceA = ClassA(array: [1, 2])
// Compile error when override is added:
// error: Initializer does not override a designated initializer from its superclass
// note: attempt to override convenience initializer here
// convenience init(array: [T]) {
// ^
let instanceB = ClassB(array: [1, 2])
But here is what I don't understand: ClassB
has a slightly different implementation of init(array:)
and I would like to override that convenience initializer. Using the override
keyword produces a compile error. Am I understanding these initialization concepts wrongly?