12
protocol Car {
    static func foo() 
}

struct Truck : Car {

}

extension Car {
    static func foo() {
        print("bar")
    }
}

Car.foo() // Does not work  
// Error: Car does not have a member named foo

Truck.foo() // Works

XcodeはCar.foo()正しくオートコンプリートするので、私が尋ねているのは、それがコンパイルされないバグであるかどうかです(foo()という名前のメンバーがないと言います)。プロトコル拡張で定義されている場合、静的メソッドをプロトコルで直接呼び出すことができますか?

4

2 に答える 2

9

アップルドキュメント

プロトコル自体は、実際には機能を実装していません。それにもかかわらず、作成したプロトコルは、コードで使用するための本格的なタイプになります。

したがって、プロトコルの静的メソッドを直接呼び出すことはできません。

于 2015-08-14T09:44:59.077 に答える
1

いいえ、エラー メッセージは適切ではありませんが、正しいことを示しています。

このように考えてください、あなたは持つことができません

protocol Car {
    static func foo() {
        print("bar")
    }
}

これは、「プロトコルメソッドに本体がない可能性があります」というエラーでコンパイルされます。

プロトコル拡張は、存在しないプロトコルに機能を追加しません。

于 2015-08-14T09:35:00.620 に答える