ios - Objective-C 中的复合语句

标签 ios objective-c macos

我在浏览一些示例 Objective-C 代码时发现了一个有趣的部分,它使用了我以前从未见过的语法。下面的代码不是来自示例,它只是一个示例。

MyObject *obj = ({
    MyObject *obj = [MyObject new];
    [obj performSomeSetup];
    obj.someProperty = someValue;
    obj;
});

经过一些挖掘我发现这叫做 compound statement ,并且是 C 的一个特性。使用这种语法似乎是一种将对象创建封装在一个方法中的干净方法,我已经开始将这种语法用于如下的类构造函数以及上面的对象创建.

+ (instancetype)objectWithValue:(id)someValue {
    return ({
        MyObject *obj = [MyObject new];
        obj.somePrivateProperty = someValue;
        obj;
    });
}

我非常喜欢这种语法,但不清楚这是否滥用了不应该以这种方式使用的功能。所以我想我想问的是有什么理由不应该使用这种类型的语法吗?

最佳答案

最实际的用途是创建一个 block 给你局部变量(它会在结束后自动消失)。

对于您发布的用途,它没有任何危害,并且可能不会产生任何影响,具体取决于优化。但是,如果过度使用,它会降低其可维护性和可读性。

这个:

MyObject *obj = ({
    MyObject *obj = [MyObject new];
    [obj performSomeSetup];
    obj.someProperty = someValue;
    obj;
});

可以简化为更简单的形式:

MyObject *obj = [MyObject new];
[obj performSomeSetup];
obj.someProperty = someValue;

同样,这个:

+ (instancetype)objectWithValue:(id)someValue {
    MyObject *obj = [MyObject new];
    obj.somePrivateProperty = someValue;
    return obj;
}

比不必要的 block 简单得多:

+ (instancetype)objectWithValue:(id)someValue {
    return ({
        MyObject *obj = [MyObject new];
        obj.somePrivateProperty = someValue;
        obj;
    });
}

关于ios - Objective-C 中的复合语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35903991/

相关文章:

objective-c - 禁止 UIPickerView 加载 - Obj C

iphone - 在 CoreData 上保存和检索 UIImage

macos - NSAlert:使第二个按钮既是默认按钮又是取消按钮

ios - 如何避免 "Terminating app due to uncaught exception"

ios - XML 解析器正在阻塞主线程

ios - MPMoviePlayerController 不适用于文档文件夹中的电影

ios - 核心数据 : What difference between insertNewObject vs designated initializer

ios - 创建用于 AWS DynamoDB 的唯一主键

swift - NSView .transform 等效吗?

node.js - 使用Electron/Node.js,如何检测macOS上所有已安装的浏览器?