Getestet und auf einer Probe Spielplatz arbeiten.
import UIKit
protocol MyDelegate {
func delegatedFunction(a: String)
}
class DelegatorClass {
var delegate: MyDelegate?
func callDelegate() {
delegate?.delegatedFunction("Hello World!")
}
}
class DelegateClass: MyDelegate {
let my_class = DelegatorClass()
init() {
my_class.delegate = self
}
// MyDelegate Protocol implementation
func delegatedFunction(a: String) {
print(a)
}
}
Um es zu testen, fügen Sie die folgenden Zeilen unten hinzu.
let c = DelegateClass()
c.my_class.callDelegate()
erklären zu,
Wenn Sie die Instanz von DelegateClass c
und es initialisiert wird, die init
Methode erstellen ausgeführt. Die DelegatorClass-Instanz my_class
Mitglied delegate
enthält jetzt einen Verweis auf self
, die die DelegateClass ist.
Wenn nun die callDelegate()
Methode ausgeführt wird, da die optionale Variable delegate
jetzt einen Verweis auf die DelegateClass Instanz enthält, ruft sie grundsätzlich für die Durchführung der delegatedFunction(a: String)
Methode. Und deshalb wird die Zeichenkette a
gedruckt.
Beachten Sie auch, dass der Grund, warum ich my_class.delegate = self
innerhalb init()
setzen musste, ist, weil Sie nur Instanzeigenschaftsdeklarationen außerhalb von Methoden in einer Klasse haben können. Alle Funktionen sollten in Methoden gehen.
Ich hoffe, dass die Erklärung klar war! :)
Sie benötigen Verbinden Sie die Variable Delegate mit der DelegateClass, bevor Sie mit dem Aufruf fortfahren. In diesem Fall rufen Sie eine Funktion über einen Nullwert auf, der ein Laufzeitfehler ist! – kandelvijaya
Die Delegierung ähnelt der interface-basierten Komposition von Objekten. Dies ist eine Möglichkeit, Objekte und Verantwortlichkeiten zu entkoppeln. Sie können vielleicht besser zu schätzen wissen, wenn Sie die ersten 3 Kapitel von Head First mit Design Patterns lesen. – kandelvijaya