我正在浏览一些示例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;
});
}
我非常喜欢这种语法,但我不清楚这是否滥用了一种不打算以这种方式使用的功能。所以我想我问我有什么理由不应该使用这种语法吗?
答案 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行额外的代码。