Swift-Delegat für eine generische Klasse

7

Ich habe eine Klasse, die zu einem Delegaten aufrufen muss, wenn sich eine seiner Eigenschaften ändert. Hier sind die vereinfachte Klasse und das vereinfachte Protokoll für den Delegierten:

%Vor%

Das alles funktioniert gut. Aber ich möchte diese Klasse generisch machen. Also, ich habe es versucht:

%Vor%

Dies wirft zwei Compilerfehler auf. Zuerst gibt die Zeile valueChanged im Protokoll deklarieren: Reference to generic type 'MyClass' requires arguments in <...> . Zweitens ruft der Aufruf von valueChanged im didSet -Watcher: 'MyClassDelegate' does not have a member named 'valueChanged' .

Ich dachte, ein typealias würde das Problem lösen:

%Vor%

Ich bin auf dem richtigen Weg, aber ich habe immer noch zwei Compilerfehler. Der zweite Fehler von oben bleibt ebenso wie ein neuer Fehler in der Zeile, die die Eigenschaft delegate von MyClass : Protocol 'MyClassDelegate' can only be used as a generic constraint because it has Self or associated type requirements deklariert.

Gibt es eine Möglichkeit, dies zu erreichen?

    
GarlicFries 19.02.2015, 19:18
quelle

3 Antworten

24

Es ist schwierig zu wissen, welche Lösung für Ihr Problem am besten geeignet ist, ohne weitere Informationen zu haben. Eine mögliche Lösung besteht darin, Ihre Protokolldeklaration wie folgt zu ändern:

%Vor%

Das macht typealias im Protokoll überflüssig und sollte die Fehlermeldungen beheben, die Sie bekommen haben.

Teil des Grundes, warum ich nicht sicher bin, ob dies die beste Lösung für Sie ist, ist, weil ich nicht weiß, wie oder wo die Funktion valueChanged aufgerufen wird, und so weiß ich nicht, ob es praktisch ist um dieser Funktion einen generischen Parameter hinzuzufügen. Wenn diese Lösung nicht funktioniert, poste einen Kommentar.

    
Aaron Rasmussen 19.02.2015, 19:30
quelle
3

Sie können Schablonenmethoden mit dem Typ löschen verwenden ...

%Vor%     
Dsjove 16.08.2015 13:30
quelle
2

Protokolle können Typanforderungen haben, können aber nicht generisch sein; Protokolle mit Typanforderungen können als generische Einschränkungen verwendet werden, sie können jedoch nicht zum Eingeben von Werten verwendet werden. Aus diesem Grund können Sie Ihren Protokolltyp nicht von Ihrer generischen Klasse referenzieren, wenn Sie diesen Pfad verwenden.

Wenn Ihr Delegationsprotokoll sehr einfach ist (wie eine oder zwei Methoden), können Sie anstelle eines Protokollobjekts Schließungen akzeptieren:

%Vor%

Sie können das Konzept auf eine Struktur erweitern, die eine Reihe von Closures enthält:

%Vor%

Seien Sie besonders vorsichtig bei der Speicherverwaltung, da Blöcke einen starken Bezug auf das Objekt haben, auf das sie sich beziehen. Im Gegensatz dazu sind Delegaten typischerweise schwache Referenzen, um Zyklen zu vermeiden.

    
zneak 19.02.2015 19:44
quelle

Tags und Links