2010-11-10 4 views
7

J'essaie d'implémenter une classe de stratégie très simple en Objective-C qui permet de définir des stratégies en ligne au lieu d'être définies par l'héritage. mon code ressemble actuellement à ceci:Est-il possible de définir un bloc en tant que membre d'une classe?

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

@end 

Je pensais que cela fonctionnerait, mais j'obtiens l'erreur

attendu spécificateur-qualification-liste avant '(' jeton

Des idées comment faire ce travail?

Répondre

17

Vous devez déposer les parenthèses autour NSArray * dans la définition de Ivar:

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

@end 

Aussi, je recommande fortement que vous utilisez un typedef pour plus de clarté:

typedef NSArray * (^Strategy)(void); 

@interface SSTaskStrategy : NSObject { 
    Strategy block; 
} 

@end 

Cela vous permet de faire référence à ce bloquer avec le nom Strategy au lieu d'avoir à utiliser la syntaxe funky chaque fois que vous souhaitez le référencer.

+1

+1 pour le typedef. – BoltClock

+0

@BoltClock Merci! –

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

Vous n'avez pas besoin de mettre le () autour du type de retour.

Questions connexes