schnell: Abschlussdeklaration wie Blockdeklaration

90

Wir können Block wie folgt in Objective-C deklarieren.

typedef void (^CompletionBlock) (NSString* completionReason);

Ich versuche dies schnell zu tun, es gibt Fehler.

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction

Fehler: Verwendung der nicht deklarierten 'CompletionFunction'

Definition:

var completion: CompletionBlock = { }

Wie macht man das?

Aktualisieren:

Gemäß der Antwort von @ jtbandes kann ich einen Abschluss mit mehreren Argumenten erstellen

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
quelle
1
@ Downvotters: Bitte erklären Sie, was mit dieser Frage falsch ist?
Mani
1
Es gibt eine Reihe von Menschen, die der Meinung sind, wir sollten zuerst eine schnelle Sprache lernen und dann schreiben. Dumme Gefühle ...
Janak Nirmal
@ Mani Hallo, würde es Ihnen etwas ausmachen, auch zu zeigen, wie Sie diesen Typ-Alias ​​einem zuweisen würden var(dh var completion: CompletionBlock = {....}mit mehreren Argumenten? Danke.
Unheilig

Antworten:

141

Die Syntax für Funktionstypen lautet (in) -> out.

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

Beachten Sie, dass die Klammern um den Eingabetyp nur ab Swift 3+ erforderlich sind.

jtbandes
quelle
Wenn es mehr als zwei Argumente braucht, wie können wir das tun? Würden Sie mich bitte anweisen, auf dieses oder ein anderes Buch zu verweisen?
Mani
Bestes Buch für Swift: Apple Inc. "The Swift Programming Language". iBooks. itun.es/ca/jEUH0.l
David Skrundz
@NSArray Ich weiß, dass nur ein Buch für Swift verfügbar ist. Aber ich frage nach dem entsprechenden Kapitel mit Thema ... :)
Mani
4
@jtbandes Es funktioniert. Ich habe mit zwei Argumenten alstypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
@zumzum Es trennt den Parameternamen " reason" vom Methodenkörper " println(reason)"
jtbandes
13

Hier ist ein großartiger Blog über die schnelle Schließung.

Hier sind einige Beispiele:

Als Variable:

var closureName: (inputTypes) -> (outputType)

Als optionale Variable:

var closureName: ((inputTypes) -> (outputType))?

Als Typalias:

typealias closureType = (inputTypes) -> (outputType)
BLC
quelle