1. ホーム
  2. swift

[解決済み] 通常のメソッドからプロトコルのデフォルト実装を呼び出す

2023-06-07 17:36:30

質問

このようなことが実現可能なのかどうか、気になります。

こんな感じのPlaygroundがあります。

protocol Foo {
    func testPrint()
}

extension Foo {
    func testPrint() {
        print("Protocol extension call")
    }
}

struct Bar: Foo {
    func testPrint() {
        // Calling self or super go call default implementation
        self.testPrint()
        print("Call from struct")
    }
}


let sth = Bar()
sth.testPrint()

でデフォルトの実装を提供できる extension で提供できますが、もし Bar がデフォルトの実装にあるもの全てに加え、追加で必要なものがあればどうでしょうか?

それは、なんとなく super. メソッドを class を使うことで、すべてのプロパティを実装するという要件を満たすことができますが、同じことを structs .

どのように解決するのですか?

まだ答えを探しているのかどうかわかりませんが、方法としては、プロトコルの定義から関数を削除し、オブジェクトをキャストして Foo にキャストし、その上でメソッドを呼び出すことです。

protocol Foo { 
    // func testPrint() <- comment this out or remove it
}

extension Foo {
    func testPrint() {
        print("Protocol extension call")
    }
}

struct Bar: Foo {
    func testPrint() {
        print("Call from struct")
        (self as Foo).testPrint() // <- cast to Foo and you'll get the  default
                                  //    function defined in the extension
    }
}

Bar().testPrint()

// Output:    "Call from struct"
//            "Protocol extension call"

なぜか、プロトコルの一部として宣言された関数ではなく、プロトコルの拡張で定義された関数である場合にのみ動作します。よくわかります。しかし、それは動作します。