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

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+.


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.