swift: dichiarazione di chiusura come una dichiarazione di blocco


90

Possiamo dichiarare il blocco come sotto in Objective-C.

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

Sto provando a farlo in fretta, dà errore.

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

Errore: utilizzo di "CompletamentoFunzione" non dichiarato

Definizione:

var completion: CompletionBlock = { }

Come fare questo?

Aggiornare:

Secondo la risposta di @ jtbandes, posso creare una chiusura con più argomenti come simili

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()

1
@ Downvotters: per favore, spiega cosa c'è di sbagliato in questa domanda?
Mani

1
ci sono molte persone che pensano che dovremmo prima imparare un linguaggio rapido e poi scrivere. Sentimenti sciocchi ...
Janak Nirmal,

@Mani Ciao, ti dispiacerebbe anche mostrare come assegneresti quell'alias di tipo a var(cioè, var completion: CompletionBlock = {....}usando più argomenti? Grazie.
Unheilig

Risposte:


141

La sintassi per i tipi di funzione è (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) }

Tieni presente che le parentesi attorno al tipo di input sono necessarie solo a partire da Swift 3+.


Se sono necessari più di due argomenti, come possiamo farlo? Mi indicheresti per favore di fare riferimento in quel libro o in qualsiasi altro?
Mani

Miglior libro per Swift: Apple Inc. "The Swift Programming Language". iBooks. itun.es/ca/jEUH0.l
David Skrundz

@NSArray So che solo un libro è disponibile per Swift. Ma sto chiedendo del capitolo corrispondente con argomento ... :)
Mani

4
@jtbandes Funziona. Ho creato con due argomenti cometypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani

@zumzum Separa il nome del parametro " reason" dal corpo del metodo " println(reason)"
jtbandes

13

Ecco un fantastico blog sulla chiusura rapida.

Ecco alcuni esempi:

Come variabile:

var closureName: (inputTypes) -> (outputType)

Come variabile opzionale:

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

Come alias di tipo:

typealias closureType = (inputTypes) -> (outputType)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.