Extensionで定義されたメソッドはOverrideできない

5年くらいSwiftを書いてきましたが今までExtensionで定義されたメソッドをOverrideする機会がなかったので、知らなかったんですが
拡張で追加されたメソッドは、その型の一部ではないため、オーバーライドすることができないようです。

これはだめ

protocol Hoge {
    func piyo() -> String
}

open class Parent {}

extension Parent: Hoge {
    func piyo() -> String {
        "parent"
    }
}

final class Child: Parent {
    override func piyo() -> String {
        "child"
    }
}

これはOK

protocol Hoge {
    func piyo() -> String
}

open class Parent: Hoge {
    func piyo() -> String {
        "hogehoge"
    }
}

final class Child: Parent {
    override func piyo() -> String {
        "child"
    }
}

どうしてもExtensionでやりたい場合

@objcをつけると

protocol Hoge {
    func piyo() -> String
}

open class Parent {}

extension Parent: Hoge {
    @objc func piyo() -> String {
        "parent"
    }
}

final class Child: Parent {
    override func piyo() -> String {
        "child"
    }
}

ジェネリクスは@objcつけてもダメ

以下のような形で親のクラスがジェネリクスで値を受け取る形になっている場合Extensionのメソッドに@objcをつけてもダメなようです。僕の遭遇したのはこのケースだったので設計を変更する必要がありました😢

open class Parent<Content: View> {}

参考文献

Allow `override` of `open` methods in & from extensions in same file as main class

日記

前の記事

🔰優待クロスやってみた