目标C中的块语法(实际上是C,我推测)是众所周知的不协调.将块作为参数传递看起来与将块声明为ivars不同,后者看起来与typedef块不同.
是否有一个完整的块声明语法列表,我可以随时查看以供快速参考?
所以,我刚刚升级到Xcode 4.4,我注意到在更改日志中:
Apple LLVM编译器支持其他C++ 11功能,包括lambdas
哪个太棒了!所以我开始编码,我找到了一些东西:
Lambdas可分配给Objective-C块:
void (^block)() = []() -> void {
NSLog(@"Inside Lambda called as block!");
};
block();
Run Code Online (Sandbox Code Playgroud)std::function 可以持有Objective-C块:
std::function<void(void)> func = ^{
NSLog(@"Block inside std::function");
};
func();
Run Code Online (Sandbox Code Playgroud)我们不能将一个Objective-C块分配给lambda:
auto lambda = []() -> {
NSLog(@"Lambda!");
};
lambda = ^{ // error!
NSLog(@"Block!");
};
lambda();
Run Code Online (Sandbox Code Playgroud)为什么是这样?鉴于我们上面所看到的,这两者在语义上是否应该是等价的?