rápido: declaración de cierre como declaración de bloque similar

90

Podemos declarar el bloque como se muestra a continuación en Objective-C.

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

Estoy tratando de hacer esto rápidamente, da error.

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

Error: uso de una 'función de finalización' no declarada

Definición :

var completion: CompletionBlock = { }

¿Como hacer esto?

Actualizar:

De acuerdo con la respuesta de @ jtbandes, puedo crear un cierre con múltiples argumentos como

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
fuente
1
@Downvotters: Explique qué hay de malo en esta pregunta.
Mani
1
Hay una serie de personas que creen que deberíamos aprender primero un lenguaje rápido y luego escribir. Sentimientos tontos ...
Janak Nirmal
@Mani Hola, ¿te importaría también mostrar cómo asignarías ese alias de tipo a un var(es decir, var completion: CompletionBlock = {....}usando múltiples argumentos? Gracias.
Unheilig

Respuestas:

141

La sintaxis de los tipos de funciones es (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) }

Tenga en cuenta que los paréntesis alrededor del tipo de entrada solo se requieren a partir de Swift 3+.

jtbandes
fuente
Si se necesitan más de dos argumentos, ¿cómo podemos hacer eso? ¿Podría indicarme una referencia en ese libro o en cualquier otro?
Mani
Mejor libro para Swift: Apple Inc. "The Swift Programming Language". iBooks. itun.es/ca/jEUH0.l
David Skrundz
@NSArray Sé que solo hay un libro disponible para Swift. Pero estoy preguntando sobre ese capítulo correspondiente con el tema ... :)
Mani
4
@jtbandes Está funcionando. He creado con dos argumentos comotypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
@zumzum Separa el nombre del parámetro " reason" del cuerpo del método " println(reason)"
jtbandes
13

Aquí hay un blog increíble sobre el cierre rápido.

Aquí hay unos ejemplos:

Como variable:

var closureName: (inputTypes) -> (outputType)

Como variable opcional:

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

Como un alias de tipo:

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