【问题标题】:ObjectiveC - determine block return type at compile timeObjective C - 在编译时确定块返回类型
【发布时间】: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,顺便说一句。
  • 编译器可以区分idNSArray* 类型。它只是运行时不能(在没有它可以查询的真实对象的情况下)。正在讨论的类型推断并非不可能。它类似于 C++ 的auto。它只是在 ObjC 中不存在。
  • @Cristik 我不清楚业务问题,但如果你想避免在代码中乱扔毛茸茸的块定义,你通常会阻止typedef。这是否完成了你想要做的事情?然后,您可以将 typedef 用于块属性、块参数等。

标签: objective-c objective-c-blocks


【解决方案1】:

有一个很好的简单的方法来获取返回类型:__typeof__(^{...}()) - 模拟块的调用。

解决方案不是我的,我是在为 Kiwi 框架 (https://github.com/kiwi-bdd/Kiwi/pull/528/files) 提交的拉取请求中发现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多