2014-11-22 92 views
3

这里有一个有趣的目标C大师在那里...有没有办法来声明一个Objective-C块typedef,其参数包含typedef?

有没有办法来声明一个Objective-C块typedef包含该typedef的参数?

typedef BOOL (^SSCellAction) (UITableViewController* inTVC, SSCellAction inChainedAction); 

这个想法是,我想使用链式菜单动作系统,允许发生一连串的工作/响应(通常为1-3项)。当最后一个动作调用时,它将通过零为inChainedAction。因为这似乎是相对微不足道的想象,如果我不知道如何在没有llvm的情况下宣布它没有声明,我会被阻止。 :)

+0

我认为你应该只有第二个typedef的延续,有相同的论点。 – 2014-11-22 19:02:59

+0

你会怎么做@jeffamaphone? – nhgrif 2014-11-22 19:12:09

+0

啊,是的。没关系。 – 2014-11-22 19:38:31

回答

1

rmaddy的评论是正确的。就像在C中一样,typedef不能使用它自己。基本上,typedef不是真正的类型,而只是编译器在编译时展开的别名。您总是可以自己手动扩展程序中的所有typedef(这有时是一个有益的练习),因此您的程序不需要编写typedef s。但是,递归typedef无法展开。

一些可能的解决方法:

  • 使用id作为参数类型,并投退成块内的权利类型。这会损失类型安全性。
  • 或者,使用一个成员的结构类型块。结构是一个真正的类型,所以它可以在其定义中使用。这样做的缺点是,你明确地把块“包装”到结构类型中去传递它,并且当你需要调用它时,通过访问该域来显式地“解开”结构到块中。这种方式是类型安全的。
+0

听起来像objC处理器可以插入的两种很好的方式来扩展接受度,以支持最初的目标。从objC开发者那里听到详细的信息会很棒。如果我们同意@ newacct的确定性解决方法是正确的,我很好奇它是否可以在未来添加。 – 2014-11-23 04:52:25

+0

@ DrewO'Meara:我认为可以向C中添加一个扩展来支持递归函数或块类型定义。它不需要特别针对Objective-C。但我不认为有人计划这么做。 – newacct 2014-11-23 06:58:15