2011-12-30 17 views
11

Estoy tratando de definir un bloque que tome un bloque como argumento.Cómo pasar un bloque como argumento a otro bloque en el Objetivo C

¿Qué pasa con la siguiente línea de código?

id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^)(void)block) { 
    NSObject *item = nil; 
    block(); 
    return item; 
}; 

¿Por qué mantener el compilador produce errores como Parameter name omitted y Expected ")"?

Respuesta

10
id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^block)(void)) { 
    NSObject *item = nil; 
    block(); 
    return item; 
}; 

Los bloques tienen una sintaxis similar a los punteros a la función. Debe declarar el nombre del bloque después de^

3

¿Te refieres posiblemente a id(^block)(void) a la RHS de la tarea?

10

Es por eso que se inventó typedef. Incrustar indicadores de funciones o tipos de bloques como este es un problema. Pruebe esto en su lugar:

typedef id (^ InnerBlock)(void); 
typedef id (^ OuterBlock)(NSString *, InnerBlock); 

Hará que trabajar con tipos de bloques sea mucho más fácil de leer. :)

+0

ah, gracias por el puntero (sin juego de palabras). Encuentro la definición de bloques realmente difícil de leer a veces y ¡typedef es de hecho la solución perfecta! Aunque mi error particular fue no entender dónde colocar el nombre de la variable del bloque. – Tony

Cuestiones relacionadas