Как передать блок в качестве аргумента в другой блок в Objective C - PullRequest
12 голосов
/ 30 декабря 2011

Я пытаюсь определить блок, который принимает блок в качестве аргумента.

Что не так со следующей строкой кода?

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

Почему компилятор продолжает выдавать ошибки типа Parameter name omitted и Expected ")"?

Ответы [ 3 ]

10 голосов
/ 30 декабря 2011
id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^block)(void)) {
    NSObject *item = nil;
    block();
    return item;
};

Блоки имеют синтаксис, аналогичный указателям на функции. Вы должны объявить имя блока после ^

10 голосов
/ 30 декабря 2011

Вот почему typedef был изобретен. Встраивание указателей на функции или таких типов блоков - это боль. Попробуйте вместо этого:

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

Это значительно облегчит работу с типами блоков. :)

3 голосов
/ 30 декабря 2011

Возможно, вы имели в виду id(^block)(void) на RHS задания?

...