Как передать блок в качестве аргумента в другой блок в 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 задания?