Ich bemühe mich, Delegationsaufgaben in den Griff zu bekommen und streiche es auf eine grundlegende Implementierung. Ich bin dazu gekommen, aber die Delegiertenfunktion wird nie aufgerufen. Könnte jemand etwas Licht werfen?
%Vor% Punkt ist bevor Sie callDelegate()
aufrufen, dem Sie delegate
zuweisen müssen. Um zu überprüfen, ob Ihre Delegierung funktioniert, können Sie DelegatorClass
mit dem Delegaten initialisieren.
Es ist nichts falsch mit Ihrem Ansatz, verwenden Sie es einfach richtig. Der Punkt ist die Delegatvariable für eine Instanz des Typs T, die dem Protokoll MyDelegate entspricht. In Ihrem Fall ist dies die DelegateClass-Instanz. Im Allgemeinen könnte T fast alles sein, das dem MyDelegate-Protokoll entspricht.
%Vor% Mit Ihrem Code können Sie auf diese Weise delegate ordnungsgemäß verwenden.
Wenn Sie callDelegate()
aufrufen, wird der Verweis auf DelegateClass
verwendet und delegatedFunction()
Weitere Informationen finden Sie in den Dokumentationen zu Apple-Protokollen. Ссылка
Getestet und an einem Beispielspielplatz gearbeitet.
%Vor%Um es zu testen, fügen Sie die folgenden Zeilen hinzu.
%Vor%Um zu erklären,
Wenn Sie die Instanz von DelegateClass c
erstellen und initialisiert wird, wird die Methode init
ausgeführt. Die DelegatorClass-Instanz my_class
member delegate
enthält jetzt einen Verweis auf self
, was die DelegateClass ist.
Wenn nun die Methode callDelegate()
ausgeführt wird, wird, da die optionale Variable delegate
jetzt einen Verweis auf die DelegateClass-Instanz enthält, im Grunde die Ausführung der Methode delegatedFunction(a: String)
verlangt. Und deshalb wird die Zeichenkette a
gedruckt.
Beachten Sie auch, dass ich my_class.delegate = self
in init()
setzen musste, weil Sie nur Instanzeigenschaftsdeklarationen außerhalb von Methoden in einer Klasse haben können. Alle Funktionalität sollte in Methoden gehen.
Ich hoffe, dass die Erklärung klar war! :)
Sie hatten es fast schon, Sie haben einfach vergessen, class DelegateClass
der Eigenschaft class DelegatorClass
delegate
zuzuordnen, mit ein paar anderen Optimierungen.
Im Grunde sagen Sie, dass class DelegateClass
der protocol MyDelegate
entspricht, was bedeutet, dass delegatedFunction(a:String)
implementiert werden muss. Bei class DelegatorClass
erwartet die Eigenschaft delegate
ein Objekt mit dem Typ protocol MyDelegate
, sodass sie die Protokollfunktion dagegen aufrufen kann. Daher ist es wichtig, self
der Eigenschaft delegate
zuzuweisen in DelegateClass