Можно ли определить блок как член класса? - PullRequest
7 голосов
/ 10 ноября 2010

Я пытаюсь реализовать очень простой класс стратегий в Objective-C, который позволяет определять стратегии внутри строки вместо определения через наследование. В настоящее время мой код выглядит так:

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

@end

Я думал, что это будет работать, но я получаю сообщение об ошибке

Ожидаемый список спецификаторов-спецификаторов перед '(' токен

Есть идеи, как заставить это работать?

Ответы [ 2 ]

17 голосов
/ 10 ноября 2010

Вы должны опустить скобки вокруг NSArray * в определении ивара:

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

@end

Кроме того, я настоятельно рекомендую вам использовать typedef для большей ясности:

typedef NSArray * (^Strategy)(void);

@interface SSTaskStrategy : NSObject {
   Strategy block;
}

@end

Это позволяет вам ссылаться на этот блок с именем Strategy вместо необходимости использовать фанки-синтаксис каждый раз, когда вы хотите сослаться на него.

2 голосов
/ 10 ноября 2010
@interface SSTaskStrategy : NSObject {
    NSArray* (^strategy)(void);
}

Вам не нужно ставить ( ) вокруг типа возврата.

...