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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top