[NSArray arrayWithObjects:nada, nada]
-
26-12-2019 - |
Pergunta
Eu tenho um imóvel self.shareURL
que pode ou não ser nil
e eu gostaria de envolvê-lo em array.Obviamente, se for nil
Não posso fazer isso, então gostaria de ter um array vazio nesse caso.Então posso escrever:
NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];
No entanto, posso construí-lo em uma chamada para shareURL
, assim:
NSArray *items = [NSArray arrayWithObjects:[self shareURL], nil];
Isso funciona porque arrayWithObjects:
irá parar de qualquer maneira assim que vir o primeiro nil
e a pilha não está corrompida porque a ABI do Objective-C não exige que ela limpe os varargs na pilha.
Posso usar o segundo formulário? Ou o primeiro é mais claro?
Solução
Ambas as opções parecem boas, mas se você está perguntando qual delas é mais clara, eu escolheria esta:
NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];
Por que?Porque você está implementando o comportamento que deseja alcançar nessa linha, não como consequência de algo acontecendo na pilha como na segunda abordagem.Em outras palavras, você está alcançando o comportamento especificado na linha.
Se sou desenvolvedor e vejo esse código, com a 1ª abordagem vou entender o comportamento, sem nenhuma explicação.
Outras dicas
Em vez de concisão, optaria pela legibilidade:
NSArray *items = nil;
if ([self shareURL]) {
items = @[[self shareURL]];
} else {
items = @[];
}
Ambas as formas estão OK, e a primeira você pode escrever assim:
NSArray *items = [self shareURL] ? : @[];
Isso está certo.
NSArray *items = [self shareURL] ? @[[self shareURL]] : @[];
Ok, para que conste, na verdade fui com
NSMutableArray *items = [NSMutableArray new];
if (self.shareURL) {
[items addObject: self.shareURL];
}
pois deixa mais claro que existe um estado "padrão" de array vazio e tentamos adicionar um objeto.