2016-08-05 90 views
1

Nach vielen Recherchen bin ich immer noch ein wenig verwirrt darüber, wie Delegierte zu verwenden und zu implementieren. Ich habe versucht, mein eigenes, vereinfachtes Beispiel zu schreiben, um mein Verständnis zu unterstützen - aber es funktioniert nicht - was bedeutet, dass ich etwas verloren sein muss.Versuchen, die Implementierung von Delegaten mit Protokollen in Swift zu verstehen

//the underlying protocol 
protocol myRules { 
    func sayName(name: String); 
} 

//the delegate that explains the protocols job 
class myRulesDelegate: myRules { 
    func sayName(name: String){ 
     print(name); 
    } 
} 

//the delegator that wants to use the delegate 
class Person{ 
    //the delegator telling which delegate to use 
    weak var delegate: myRulesDelegate!; 
    var myName: String!; 

    init(name: String){ 
     self.myName = name; 
    } 
    func useDels(){ 
     //using the delegate (this causes error) 
     delegate?.sayName(myName); 
    } 
} 

var obj = Person(name: "Tom"); 
obj.useDels(); 

Ich habe gelesen und beobachtete so viele Tutorials, aber immer noch kämpfen. Ich bekomme keinen Fehler mehr (Prost Jungs). Aber immer noch keine Ausgabe von sayName.

was zeigt, ich muss missverstehen, wie Delegierten Muster arbeiten. Ich würde wirklich eine korrigierte Version des Codes schätzen, mit einer einfachen Erklärung, warum es funktioniert und warum es hilfreich ist.

Ich hoffe, dass dies auch anderen hilft. Prost.

+0

Sie haben vergessen zu Weisen Sie den Delegierten vor der Verwendung zu. Wie 'obj.delegate = myRulesDelegate()'. Und da es implizit optional ausgepackt ist, stürzt es ab. Siehe Paulw11's Antwort. – Moritz

Antwort

2

In Swift Sie den ersten Parameter des externen Namen weglassen, so sollten Sie Ihre Funktionsaufruf delegate.sayName("Tom")

auch sein, ist es gefährlich, eine implizit ungeöffneten optional für Ihre delegate Eigenschaft zu verwenden, wie Sie gefunden haben. Sie sollten eine schwache optional verwenden:

//the underlying protocol 
protocol MyRulesDelegate: class { 
    func sayName(name: String) 
} 

//the delegator that wants to use the delegate 
class Person { 
    //the delegator referencing the delegate to use 
    weak var delegate: MyRulesDelegate? 
    var myName: String 

    init(name: String){ 
     self.myName = name 
    } 

    func useDels() { 
     //using the delegate 
     delegate?.sayName(myName) 
    } 
} 

Schließlich Ihre Stellvertretung muss ein Objekt sein, so dass Sie nicht einen Delegierten in der Art und Weise verwenden, können Sie gezeigt haben; Sie müssen eine andere Klasse, die

class SomeOtherClass: MyRulesDelegate { 

    var myPerson: Person 

    init() { 
     self.myPerson = Person(name:"Tom") 
     self.myPerson.delegate = self 
    } 

    func sayName(name: String) { 
     print("In the delegate function, the name is \(name)") 
    } 
} 


var something = SomeOtherClass() 
something.myPerson.useDels() 

Ausgabe eine Instanz von sich selbst als Delegierter einstellen:

In der Delegatfunktion, der Name ist Tom

+0

korrigiert - immer noch ein Problem - Update überprüfen. Vielen Dank. –

+0

Entschuldigung, ich hatte einen Fehler beim Ausschneiden und Einfügen, wo ich immer noch den Parameternamen 'name' einfüge – Paulw11