2016-04-19 19 views
3

Nehmen wir an, ich habe ein Protokoll und eine Klasse, die diesem Protokoll entspricht.Optionale Verschlüsse in Swift-Protokollen

Erfolgreiche Schließung ist optional, weil nicht jeder Anruf es erfordert. Dies ist zum Beispiel eine häufige Situation, wenn eine solche Funktion aus einem Komponententest aufgerufen wird, weil wir die Erwartung in der Erfolgsschließung erfüllen wollen, während in einem regulären Aufruf eine Erfolgsschließung aus irgendeinem Grund nicht erforderlich ist.

Da in den Protokollen definierten Funktionen kann keine Standardwerte für die Parameter für jeden Aufruf an dem Objekt zu Foo konform Aufgabe, haben wir es mit der Schließung nennen oder explizit nil als Verschluss Wert übergeben:

var obj: Foo 
obj = Bar() 
obj.task(nil) //CLOSURE VALUE SET TO nil 
obj.task() {} //EMPTY CLOSURE 
obj.task() //NOT ALLOWED 

Was ist eine empfohlene Methode, um eine solche Struktur zu implementieren? Müssen wir jedes Mal leere Closures übergeben oder Funktionen aufrufen, deren Closure-Wert auf Null gesetzt ist, oder gibt es einen anderen Weg, damit umzugehen?

+0

Warum ist das hässlich? Es gibt viele Fälle, in denen Sie NULL in den Completion-Block von Apfels Methoden übergeben können. Wie zum Beispiel 'vc.navigationController.pushViewController (vc2, animiert: true, completion: nil)' Es bedeutet einfach, dass Sie nichts tun wollen, nachdem die Aufgabe abgeschlossen ist. – NSGangster

+0

Ich stimme für die Schliessung dieser Frage als Primary Opinion- Basiert, weil Antworten nur auf persönlicher Meinung beruhen können, nicht auf Tatsachen. 'Was ist eine empfohlene Methode, um eine solche Struktur zu implementieren? Wenn ich jedes Mal eine leere Schließung verlasse oder Funktionen aufruft, deren Schließungswert auf Null eingestellt ist, ist das irgendwie hässlich. Was für dich hässlich ist oder von jemand anderem empfohlen wird, ist keine Tatsache. – JAL

+0

@JAL meine Meinung ist hier nicht wichtig, ich wollte fragen, ob es eine bessere Möglichkeit gibt, eine solche Struktur zu implementieren. Ich werde die Frage bearbeiten und diesen Satz entfernen – pkacprzak

Antwort

0

Hier ist ein Beispiel, wie Sie implementieren können. Das = nil ist vielleicht nicht notwendig, aber ich habe es nicht getestet.

func doSomething(closure:(()->Void)? = nil) { 
    closure?() 
} 
+0

Wenn das Objekt vom Typ Foo ist, was ein Protokoll ist, weiß es nicht, dass die Funktion in einer bestimmten Implementierung einen Standardparameter hat Set – pkacprzak

+0

vielleicht muss es nicht wissen. –

0

Meine Empfehlung:

Statt dessen:

protocol Foo { 
    func task(success: (() -> Void)?) 
} 

verwenden:

protocol Foo { 
    func task(success:() -> Void) 
} 

Sie können immer einen leeren Verschluss passieren, wenn Sie nicht brauchen, um zu behandeln Aufgabenabschluss. Optionale Schließungen machen die Absicht deines Codes weniger deutlich.