这种范围界定的forms如何?

或多或less地偶然发现了这种forms的范围

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; }); 

我认为这是创build和实例化对象和variables的好方法,因为临时variables只有在需要创build我真正需要和关心的对象时才会生存。 在上面的代码中,只要将内部dataSource写入到外部dataSourceidx将会消失,因为范围将在不久之后离开。
另外我觉得这个事实很吸引人,完全实例化和configuration的对象将被设置为外部对象。
其实我甚至不知道这是一个C或Objective-Cfunction或语法糖果添加到叮当声。


@Unheilig
这是组织代码的语法。 它不是像块或封闭的东西。 在代码的最后你只需要一个完全实例化和configuration好的对象。

如果你只需要一个对象作为parameter passing给一个方法,这个就派上用场了,但是这个对象的configuration需要多个语句。 您可以传递一个语句expression式,而不是将其分配给本地临时variables。

 [[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环境中,您甚至可以在expression式语句中调用autorelease。

所以这只是代码组织和我猜想的很多个人品味。

这是一个GCC扩展,称为“语句expression式”,在http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html中有描述。;