swift: Deklaracja zamknięcia jako deklaracja podobna do bloku

90

Możemy zadeklarować blok jak poniżej w Objective-C.

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

Próbuję to zrobić szybko, to daje błąd.

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

Błąd: użycie niezadeklarowanej funkcji uzupełniania

Definicja:

var completion: CompletionBlock = { }

Jak to zrobić?

Aktualizacja:

Zgodnie z odpowiedzią @ jtbandes, mogę utworzyć domknięcie z wieloma argumentami, tak jak podobne

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
źródło
1
@Downvotters: Proszę wyjaśnić, co jest nie tak w tym pytaniu?
Mani,
1
wiele osób uważa, że ​​powinniśmy najpierw nauczyć się szybkiego języka, a dopiero potem pisać. Głupie uczucia ...
Janak Nirmal
@Mani Cześć, czy mógłbyś również pokazać, jak przypisałbyś ten alias typu do var(tj. var completion: CompletionBlock = {....}Używając wielu argumentów? Dzięki.
Unheilig

Odpowiedzi:

141

Składnia typów funkcyjnych jest (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) }

Zwróć uwagę, że nawiasy wokół typu danych wejściowych są wymagane tylko od wersji Swift 3+.

jtbandes
źródło
Jeśli potrzeba więcej niż dwóch argumentów, jak możemy to zrobić? Czy mógłbyś skierować mnie do odniesienia w tej czy innej książce?
Mani
Najlepsza książka dla Swift: Apple Inc. „The Swift Programming Language”. iBooks. itun.es/ca/jEUH0.l
David Skrundz
@NSArray Wiem, że tylko jedna książka jest dostępna do szybkiego. Ale pytam o ten odpowiedni rozdział z tematem ... :)
Mani
4
@jtbandes To działa. Utworzyłem z dwoma argumentami jakotypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
@zumzum Oddziela nazwę parametru „ reason” od treści metody „ println(reason)
jtbandes
13

Oto niesamowity blog o szybkim zamykaniu.

Oto kilka przykładów:

Jako zmienna:

var closureName: (inputTypes) -> (outputType)

Jako opcjonalna zmienna:

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

Jako alias typu:

typealias closureType = (inputTypes) -> (outputType)
BLC
źródło