swift: déclaration de fermeture comme une déclaration de bloc

90

Nous pouvons déclarer le bloc comme ci-dessous dans Objective-C.

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

J'essaye de faire ça rapidement, ça donne une erreur.

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

Erreur: utilisation de 'completionFunction' non déclarée

Définition:

var completion: CompletionBlock = { }

Comment faire cela?

Mettre à jour:

Selon la réponse de @ jtbandes, je peux créer une clôture avec plusieurs arguments comme

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
la source
1
@Downvotters: Veuillez expliquer ce qui ne va pas avec cette question?
Mani
1
il y a un certain nombre de personnes qui pensent que nous devrions d'abord apprendre une langue rapide, puis écrire. Foolish sentiments ...
Janak Nirmal
@Mani Bonjour, pourriez-vous également montrer comment vous attribueriez ce type d'alias à a var(c'est-à-dire en var completion: CompletionBlock = {....}utilisant plusieurs arguments? Merci.
Unheilig

Réponses:

141

La syntaxe des types de fonction est (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) }

Notez que les parenthèses autour du type d'entrée ne sont requises qu'à partir de Swift 3+.

jtbandes
la source
Si cela prend plus de deux arguments, comment pouvons-nous faire cela? Pourriez-vous s'il vous plaît me diriger vers une référence dans ce livre ou dans un autre?
Mani
Meilleur livre pour Swift: Apple Inc. «The Swift Programming Language». iBooks. itun.es/ca/jEUH0.l
David Skrundz
@NSArray Je sais qu'un seul livre est disponible pour Swift. Mais je pose des questions sur ce chapitre correspondant avec le sujet ... :)
Mani
4
@jtbandes Ça marche. J'ai créé avec deux arguments commetypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
@zumzum Il sépare le nom du paramètre " reason" du corps de la méthode " println(reason)"
jtbandes
13

Voici un blog génial sur la fermeture rapide.

Voici quelques exemples:

En tant que variable:

var closureName: (inputTypes) -> (outputType)

En tant que variable facultative:

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

En tant qu'alias de type:

typealias closureType = (inputTypes) -> (outputType)
BLC
la source