有没有一种方法可以声明一个包含该typedef的Objective-C块typedef的参数?

4

这里有一个有趣的问题,针对那些精通Objective-C的人...

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

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

我的想法是使用链接菜单动作系统,允许发生一系列的工作/响应(通常为1-3项)。当最后一个操作被调用时,将传递inChainedAction的nil值。虽然这似乎相对简单,但我却无法在不被LLVM拒绝的情况下声明它。 :)


我认为你应该为续体只有相同参数的第二个typedef。 - i_am_jorf
你会怎么做,@jeffamaphone? - nhgrif
啊,好的。没事了。 - i_am_jorf
1
这似乎是不可能的。这本质上与在C中尝试为具有相同函数作为参数的函数typedef相同。例如,请参见https://dev59.com/4XRA5IYBdhLWcg3w4SDo和相关问题。 - rmaddy
就像将一个数组添加到它自身中一样,我认为这可能会在内存管理方面引起严重问题。 - Rob Sanders
显示剩余2条评论
1个回答

2
rmaddy的评论是正确的。就像在C语言中,一个typedef不能使用自身。基本上,typedef并不产生实际类型,而只是将编译器在编译时扩展的别名。你可以手动扩展程序中的所有typedef(有时这是有益的练习),以便你的程序没有typedef。但是,递归的typedef无法扩展。
一些可能的解决方法:
- 使用id作为参数类型,并在块内部转换回正确的类型。这会丢失类型安全性。 - 或者,使用一个只有一个成员的结构体类型来传递块。结构体是真正的类型,所以它可以在其定义内部使用。缺点是你需要显式地将块“包装”到结构体类型中进行传递,并在需要调用它时通过访问字段显式地将结构体“展开”成块。这种方式是类型安全的。

听起来像两种优秀的方式,ObjC处理器可以插入以扩展接受度以支持最初的目标。如果能听到一位ObjC开发者的详细说明将会很好。我很好奇如果我们同意@newacct的确定性解决方法是否正确,它是否可以在未来被添加进去。 - Drew O'Meara
@DrewO'Meara:我认为可以在C中添加扩展来支持递归函数或块typedefs。这与Objective-C无关。但我不认为有人计划这样做。 - newacct

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