我今天有一个摘要
self.tableView = ({
CGRect frame = CGRectMake(0.f, 0.f, kBPNavigationBarClockInOutAssociatesTableViewWidth,
kBPNavigationBarClockInOutAssociatesTableViewHeight);
UITableView * tableView =
[[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
tableView.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin
|UIViewAutoresizingFlexibleBottomMargin
|UIViewAutoresizingFlexibleWidth);
tableView.delegate = self;
tableView.dataSource = self;
[tableView setOpaque:NO];
[tableView setScrollEnabled:YES];
[tableView setBounces:YES];
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[tableView setBackgroundView:nil];
[tableView setBackgroundColor:[UIColor clearColor]];
tableView;
});
({})很有意思,它可以在同步模式下运行包装的代码,并在其内容的末尾返回tableView的对象。
我只是认为这是一个块,但是为什么它看起来不是这样:
UITableView * (^testBlock) (void) = ^{ // Codes here... return tableView;};
UITableView *myTableView = testBlock();
当我在Xcode中测试代码时,({})不在异步模式下,但是根据我的经验,该块始终(异步运行在块上吗?)。那么为什么不在这里呢?
当我使用返回对象对块语法进行谷歌搜索时,我发现所有块都返回原始值,例如BOOL和Double,并且没有足够的幸运找到一个返回对象的对象。块只能返回原始值,这是真的吗?
复习:
我在为什么这个基本的Objective C块代码无法正常工作时找到了这个代码片段?:
NSString *(^print_block)() = ^{
return @"this block worked!";
};
NSLog(@"%@", print_block());
所以我认为一个块也可以返回一个对象类型。
非常感谢!
我想我会把我的评论作为答案。这不是一个障碍。这是GCC / LLVM中一种有趣的编译器/代码机制的情况,称为“表达式中的语句和声明”。
它使您能够执行任意代码块,并使最后一条语句成为赋值的返回值。因此,在您的情况下,返回的内容是最后一行tableview
。
就我个人而言,我认为这里使用它的方式令人困惑。函数或仅内联编写该代码可能会更好。
这个用例(至少我已经找到了)通常在开发预处理器宏中,这些宏执行带有自动变量的一些代码并返回其值,例如:
#define pow( _x ) ({ int x = (_x); x*x; })
举一个简单的例子,也许不是那么好,因为我假设的值_x
可分配给int
,但您明白了。请注意,在此宏中如何_x
只被评估一次。
与其他类型的宏评估相比,我主要在这里看到此语法的实用程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句