我有一个属性self.shareURL
,可能是nil
,也可能不是nil
,我想把它包装在数组中。显然,如果它是NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];
我不能这样做,所以我想在这种情况下有一个空数组。所以我可以写:
shareURL
但是,我可以在NSArray *items = [NSArray arrayWithObjects:[self shareURL], nil];
的一次调用中构建它,如下所示:
arrayWithObjects:
这是有效的,因为nil
一旦看到第一个{{1}}就会停止并且堆栈没有被破坏,因为Objective-C ABI不要求它清除堆栈中的varargs。
是否可以使用第二种形式?或者第一种形式更清晰?
答案 0 :(得分:2)
这两个选项看起来都不错,但如果你要问哪一个更清楚,我会选择这个:
NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];
为什么呢?因为您正在实现您希望在该行中实现的行为,而不是像第二种方法那样在堆栈上发生的事情。换句话说,您正在实现您在行中指定的行为。
如果我是开发人员并且我看到了该代码,那么我会理解这种行为,并且没有任何解释。
答案 1 :(得分:1)
而不是简洁,我会选择可读性:
NSArray *items = nil;
if ([self shareURL]) {
items = @[[self shareURL]];
} else {
items = @[];
}
答案 2 :(得分:0)
两种方式都可以,第一种方法可以这样写:
<德尔> NSArray *items = [self shareURL] ? : @[];
德尔>
这是对的。
NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];
答案 3 :(得分:0)
好的,为了记录,我实际上是
NSMutableArray *items = [NSMutableArray new];
if (self.shareURL) {
[items addObject: self.shareURL];
}
因为它更清楚地表明存在空数组的“默认”状态,并且我们尝试添加一个对象。