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) -> ()

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.


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.