Objective-C中的复合语句

Cha*_*son 2 macos objective-c ios

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

MyObject *obj = ({
    MyObject *obj = [MyObject new];
    [obj performSomeSetup];
    obj.someProperty = someValue;
    obj;
});
Run Code Online (Sandbox Code Playgroud)

在做了一些挖掘后,我发现这被称为复合语句,并且是C的一个特性.使用这种语法似乎是一种将对象创建封装在方法中的简洁方法,并且我已经开始使用这种方法类构造函数的语法如下,以及上面的对象创建.

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

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

sid*_*yll 6

最实际的用途是创建一个块为你提供局部变量(它会在结束后自动消失).

对于您发布的用途,它没有任何危害,并且根据优化可能不起作用.然而,如果过度使用,它会使其不易维护和可读.

这个:

MyObject *obj = ({
    MyObject *obj = [MyObject new];
    [obj performSomeSetup];
    obj.someProperty = someValue;
    obj;
});
Run Code Online (Sandbox Code Playgroud)

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

MyObject *obj = [MyObject new];
[obj performSomeSetup];
obj.someProperty = someValue;
Run Code Online (Sandbox Code Playgroud)

同样地,这个:

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

比不必要的块简单得多:

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