如何在Objective C中将一个代码块作为参数传递到另一个代码块中?

12
我试图定义一个接受块作为参数的代码块。 以下代码行有什么问题?
id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^)(void)block) {
    NSObject *item = nil;
    block();
    return item;
};

为什么编译器总是报错,提示“省略了参数名”和“期望右括号”?

3个回答

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

块的语法与函数指针类似。您必须在^后声明块名称。


10

这就是 typedef 被发明的原因。像这样嵌入函数指针或块类型很麻烦。请尝试使用这个:

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

这将使与块类型的工作更易读。:)


啊,谢谢指点(没有双关语)。我有时觉得块定义真的很难读,而typedef确实是完美的解决方案!尽管我的特定错误是误解了块变量名应放置的位置。 - Tony

3

您是否可能在赋值的右侧意味着 id(^block)(void)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接