2013-11-18 4 views
0

У меня есть свойство self.shareURL, которое может быть или не быть nil, и я хотел бы обернуть его в массив. Очевидно, если это nil, я не могу этого сделать, поэтому я хотел бы иметь пустой массив в этом случае. Так что я могу написать:[NSArray arrayWithObjects: nil, nil]

NSArray *items = [self shareURL] ? @[[self shareURL]] : @[]; 

Однако, я могу построить его в одном вызове shareURL, как это:

NSArray *items = [NSArray arrayWithObjects:[self shareURL], nil]; 

Это работает, потому что arrayWithObjects: остановится в любом случае, когда он видит первый nil и стек не поврежден, потому что Objective-C ABI не требует, чтобы он очищал varargs в стеке.

Можно ли использовать вторую форму? Или первый, более четкий?

+0

Да, вторая форма должна работать. Однако, если вы его используете, обязательно прокомментируйте эту операцию, чтобы вы поняли, что вы делаете через год. –

ответ

2

Оба варианта кажутся хорошо, но если вы спрашиваете, для которых один является более ясным, я бы пойти на это:

NSArray *items = [self shareURL] ? @[[self shareURL]] : @[]; 

Почему? Поскольку вы реализуете поведение, которое хотите достичь в этой строке, а не как следствие того, что что-то происходит в стеке, как на втором подходе. Другими словами, вы достигаете поведения, которое вы указываете в строке.

Если я разработчик, и я вижу этот код, с 1-м подходом я пойму поведение, без каких-либо объяснений.

+2

Также второй показывает, что массив будет содержать объект, который может сработать в будущем. то есть вы можете предположить, что вы можете вызывать 'objectAtIndex: 0' и вызывать исключение, сразу не станет очевидным, почему массив пуст. –

+0

После некоторого раздумья, да, во втором примере намерение действительно не ясно. –

0

Оба пути правильны, и первое из них вы можете написать так:

NSArray *items = [self shareURL] ? : @[];

Это правильно.

NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];

+0

Нет, это '- (NSURL *) shareURL', он не возвращает массив. –

+0

О, это моя ошибка. Это должно быть 'NSArray * items = [self shareURL]? @ [[self shareURL]]: @ []; ' – Wei

1

Вместо того, краткость, я выбрал бы для читаемости:

NSArray *items = nil; 
if ([self shareURL]) { 
    items = @[[self shareURL]]; 
} else { 
    items = @[]; 
} 
+0

Я согласен, и на самом деле я решил использовать нечто похожее вместо одного из однострочных. –

0

Ok, для записи, я на самом деле пошел с

NSMutableArray *items = [NSMutableArray new]; 
if (self.shareURL) { 
    [items addObject: self.shareURL]; 
} 

как это делает более очевидным, что является «стандартным» состоянием пустого массива, и мы пытаемся добавить один объект.

+0

За исключением того, что вы теперь изменили свой API, чтобы вернуть изменчивый массив, а не неизменный. – Abizern

+0

В этом конкретном случае (и именно поэтому он не является строго ответом на вопрос), 'items' является одноразовым массивом, который не хранится и не возвращается, поэтому это не имеет большого значения. Я мог бы также передать его с помощью «-copy», если это необходимо. –

Смежные вопросы