2010-11-10 9 views
7

Estoy tratando de implementar una clase de estrategia muy simple en Objective-C que permite que las estrategias se definan en línea en lugar de definirse a través de la herencia. Actualmente mi código es el siguiente:¿Es posible definir un bloque como miembro de una clase?

@interface SSTaskStrategy : NSObject { 
    (NSArray *)(^strategy)(void); 
} 

@end 

pensé que esto iba a funcionar, pero estoy consiguiendo el error

especificador-calificador lista de espera para antes '(' token de

¿Alguna idea de cómo hacer que esto funcione?

Respuesta

17

Debe retirar los paréntesis alrededor NSArray * en la definición de Ivar:

@interface SSTaskStrategy : NSObject { 
    NSArray * (^strategy)(void); 
} 

@end 

Además, le recomiendo que utilice un typedef para más claridad:

typedef NSArray * (^Strategy)(void); 

@interface SSTaskStrategy : NSObject { 
    Strategy block; 
} 

@end 

Esto permite hacer referencia a este bloquear con el nombre Strategy en lugar de tener que usar la sintaxis funky cada vez que desee hacer referencia a ella.

+1

+1 para typedef. – BoltClock

+0

@BoltClock ¡Gracias! –

2
@interface SSTaskStrategy : NSObject { 
    NSArray* (^strategy)(void); 
} 

No necesita poner el () alrededor del tipo de devolución.

Cuestiones relacionadas