或多或少偶然地发现了这种形式的范围
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。
所以我认为只是代码组织和个人品味。