Convenience Init Override

I am having issues understanding why Swift is not letting me override my convenience initialiser. 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.

  • XcCode5: How do relationships work with interface builder?
  • Extensions May not contain Stored properties
  • When should I call super?
  • UIBezierPath Subclass Initializer
  • iOS: UIView subclass init or initWithFrame:?
  • @protected in Objective-C
  • 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 initialisers are inherited into ClassB. Furthermore, since I inherited all the designated initialisers as per rule one, I also get all my convenience initialisers inherited.

    class ClassA<T> {
        // This array would be private and not visible from ClassB
        var array: [T]?
        init() { }
        convenience init(array: [T]) {
            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 i do.
        convenience init(array: [T]) {
            self.anotherArray = array
    // Works fine
    let instanceA = ClassA(array: [1, 2])
    // Compile error
    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 initialiser. Using the override keyword produces a compile error and leaving it as is also produces a compile time error. Am I understanding these initialisation concepts wrongly?

    Solutions Collect From Internet About “Convenience Init Override”

    The reason override is unneeded:

    Conversely, if you write a subclass initializer that matches a superclass convenience initializer, that superclass convenience initializer can never be called directly by your subclass, as per the rules described above in Initializer Chaining. Therefore, your subclass is not (strictly speaking) providing an override of the superclass initializer. As a result, you do not write the override modifier when providing a matching implementation of a superclass convenience initializer.

    But as written, it seems it should work — as far as I can tell this is a compiler bug. If you change the name of the array argument to ClassB’s initializer to e.g. array2, then it works as expected. You should file a Radar!