[NSArray arrayWithObjects:nil,nil]

时间:2013-11-18 10:39:43

标签: objective-c arrays abi function-call

我有一个属性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。

是否可以使用第二种形式?或者第一种形式更清晰?

4 个答案:

答案 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];
}

因为它更清楚地表明存在空数组的“默认”状态,并且我们尝试添加一个对象。