这种形式的范围如何称为?

时间:2014-01-10 06:28:04

标签: objective-c c clang

或多或少偶然地发现了这种形式的范围

DataSource *dataSource =({
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
    DataSource *dataSource = [DataSource new];
    dataSource.address = self.destinations[idx][0];
    dataSource.name    = self.destinations[idx][1];
    dataSource;
});

我认为这是创建和实例化对象和变量的好方法,因为临时变量只有在需要创建我真正需要和关心的对象时才会存在。在上面的代码idx中,只要我将内部dataSource写入外部dataSource,就会消失{,1}},因为范围很快就会被留下。
此外,我发现一个吸引人的事实是,一个完全实例化和配置的对象将被设置为外部对象 实际上我甚至不知道这是C或Objective-C功能还是添加到clang的语法糖果。


@Unheilig
这是组织代码的语法。它不像块或闭包。在代码的末尾,您只需要一个完全实例化和配置的对象。

如果您只需要一个对象将其作为参数传递给方法,那么这会派上用场,但该对象的配置需要多个语句。您可以传入语句表达式,而不是将其分配给本地临时变量。

[[MYViewController alloc] initWithDataSource:({
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
    DataSource *dataSource = [DataSource new];
    dataSource.address = self.destinations[idx][@"address"];
    dataSource.name    = self.destinations[idx][@"name"];
    dataSource;
})];

在非ARC环境中,您甚至可以在表达式语句中调用autorelease。

所以我认为只是代码组织和个人品味。

1 个答案:

答案 0 :(得分:9)

这是一个名为“声明表达”的GCC扩展,在http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html描述。