Objective-C中的复合语句

时间:2016-03-09 22:30:19

标签: 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;
    });
}

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

2 个答案:

答案 0 :(得分:6)

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

对于您发布的用途,它没有任何危害,根据优化情况,可能无效。然而,如果过度使用,它会使其不易维护和可读。

此:

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

比不必要的块简单得多:

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

答案 1 :(得分:0)

没有理由不使用。代码完全相同。计算值,然后从方法返回。

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

与:

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

唯一的区别是,在第一种情况下,你有2行额外的代码。