【发布时间】:2014-05-08 20:40:33
【问题描述】:
是否可以在编译时确定已声明块的返回类型?编译器通过基于块内的返回语句推断类型来做到这一点。程序员也可以得到这个结果吗?
例如:
^{
return [NSArray array];
}
被编译器翻译成
^NSArray*(){
return [NSArray array];
}
我想要实现的是一个类似于__typeof__ 的宏,但它返回块返回类型。例如像DECLARE_BLOCK(myBlock, ^{return [NSArray array];}) 这样的宏将扩展为NSArray* (^myBlock)() = ^{...}。
我可以使用该宏来允许声明灵活的块,类似于C++11 中的auto 构造。
【问题讨论】:
-
正是这样的问题让我想知道为什么你需要这种行为?您能详细说明您要解决的问题吗?
-
我很好奇您在这里所说的编译器“根据块内的返回语句推断类型”是什么意思。编译器知道它期望的类型(基于您要消除的声明),并且它验证类型匹配。这与类型推断不同。
-
这甚至没有意义。如果你有
^id{return @[];}怎么办?它返回一个NSArray*,但它的返回类型是id。很确定编译器认为您的示例也返回id,顺便说一句。 -
编译器可以区分
id和NSArray*类型。它只是运行时不能(在没有它可以查询的真实对象的情况下)。正在讨论的类型推断并非不可能。它类似于 C++ 的auto。它只是在 ObjC 中不存在。 -
@Cristik 我不清楚业务问题,但如果你想避免在代码中乱扔毛茸茸的块定义,你通常会阻止
typedef。这是否完成了你想要做的事情?然后,您可以将typedef用于块属性、块参数等。
标签: objective-c objective-c-blocks