Implementierung Beachten Sie Folgendes:Swift Protokollerweiterung ein anderes Protokoll mit gemeinsamen zugehörigen Typ
protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
func hi() -> A
}
extension FooBar {
func hello() -> A {
return hi()
}
}
class FooBarClass: FooBar {
typealias A = String
func hi() -> String {
return "hello world"
}
}
Dieser Code kompiliert wird. Aber wenn ich die explizite Definition des zugehörigen Typs typealias A = String
auskommentiere, kann swiftc aus irgendeinem Grund den Typ nicht ableiten.
Ich spüre dies mit zwei zu tun hat Protokolle die gleichen Typen zugeordnet teilen aber ohne direkte Behauptung durch, zum Beispiel Typ Parametrierung (vielleicht zugehöriger Typ ist nicht mächtig/reif genug?), Die es macht mehrdeutig für Typschlussfolgerung.
Ich bin mir nicht sicher, ob dies ein Fehler/Unreife der Sprache ist, oder vielleicht, ich bin einige Nuancen in Protokollerweiterung fehle die zu Recht zu diesem Verhalten führen.
Kann jemand etwas Licht darauf werfen?
, wenn Sie schnellen sagen nicht die Art zu folgern, was ist der Compiler-Fehler und auf der Linie? –
@PatrickGoley Swift sieht 'hallo()' und 'hi()' 's nicht zurück und gibt' A' als äquivalenten Typ zurück und verlangt daher, dass ich 'hallo()' zusätzlich implementiere. Es sagt, dass "FooBarClass" dem Protokoll 'FooBar' nicht entsprechen kann –
Ich denke, dass dies als ein Fehler betrachtet werden sollte. Der Workaround, den ich gefunden habe, deklariert 'typeias' im' FooBar'-Protokoll. zB: 'protocol FooBar: Foo {typealias A; func hi() -> A} ' – rintaro