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

 1021365712_3a478e 发布于 2023-02-04 17:43

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

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,上面的代码将会消失,因为范围将很快被留下.
此外,我发现一个吸引人的事实是完全实例化和配置的对象将被设置为外部对象.
实际上我甚至不知道这是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 个回答
  • 它是一个GCC扩展,称为"语句表达",在http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html中有描述.

    2023-02-04 17:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有