2014-10-12 10 views
9

Ich muss eine Schnittstelle als Parameter an eine Funktion übergeben. Schnittstelle ist generisch a.k.a hat einen zugeordneten Typ. Ich konnte keinen guten Weg finden, das zu tun. Hier ist mein Code:Wie Protokoll mit zugehörigem Typ (generisches Protokoll) als Parameter in Swift?

protocol IObserver : class { 
    typealias DelegateT 
    ... 
} 

class Observer: IObserver { 
    typealias DelegateT = IGeneralEventsDelegate // IGeneralEventsDelegate is a protocol 
    ... 
} 

func notify(observer: IObserver) { ... } // here I need a type for observer param 

fand ich, dass dies funktionieren wird:

func notify<T: IObserver where T.DelegateT == IGeneralEventsDelegate>(observer: T) { ... } 

, sondern kommen auf das zu kompliziert ist. Was, wenn ich diesen Parameter in der Klassenvariablen speichern möchte, sollte ich die ganze Klasse generisch machen, nur wegen dieser Funktion.

Es ist wahr, dass ich C++ Entwickler und ich bin neu in der Swift Sprache, aber die Art, wie die Dinge getan werden, ist viel zu kompliziert und benutzerunfreundlich ... oder ich bin zu blöd :)

+0

glaube ich auch jedes Mal. Unannehmlichkeit wirklich. In Bezug auf C++ denke ich Swifts "Protokoll" sieht aus wie "Konzept". Und eine "Erweiterung" mit einem Typ, der einem "Protokoll" entspricht, ist ähnlich wie "Konzeptkarte". Diese Einrichtungen sind nützlich, um kompilierungszeitlichen Polymorphismus zu realisieren. In vielen Fällen wünschen wir uns jedoch einen Mechanismus wie 'pure virtual class' +' multiple vererbung', entspricht Javas 'interface', um Laufzeitpolymorphie zu realisieren. Aber Swift könnte keine Mechanismen haben, die diesen für generische Typen entsprechen. – findall

+0

Siehe meine diesbezügliche Antwort hier --- --- http://stackoverflow.com/a/34995198/5389500 – eonist

Antwort

5

Wenn Sie in einem Protokoll typealias verwenden, um es generisch zu machen, dann können Sie es nicht als Variablentyp verwenden, bis der zugehörige Typ aufgelöst ist. Wie Sie wahrscheinlich erlebt haben, ein Protokoll mit zugehörigem Typ mit einer Variablen (oder Funktionsparameter) führt zu einem Übersetzungsfehler zu definieren:

Protocol 'MyProtocol' can only be used as a generic constraint because it has Self os associated type requirements

Das bedeutet, dass Sie es nicht als konkreter nutzen können.

So sind die nur 2 Möglichkeiten, wie ich bin bewusst ein Protokoll mit zugehörigem Typ als konkreter zu verwenden sind:

  • indirekt durch Erstellen einer Klasse, die es implementiert. Wahrscheinlich nicht, was Sie geplant haben
  • machen explizit die zugehörige Art zu tun, wie Sie in Ihrem func tat

Siehe auch verwandte Antwort https://stackoverflow.com/a/26271483/148357

Verwandte Themen