Как передать блок в качестве аргумента в другой блок в Objective C

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

Что случилось со следующей строкой кода?

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

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

Ответ 1

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

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

Ответ 2

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

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

Это упростит работу с типами блоков.:)

Ответ 3

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