Existe uma maneira mais inteligente de reescrever isso?
if ([cardName isEqualToString:@"Six"]) {
[self setValue:6];
} else if ([cardName isEqualToString:@"Seven"]) {
[self setValue:7];
} else if ([cardName isEqualToString:@"Eight"]) {
[self setValue:8];
} else if ([cardName isEqualToString:@"Nine"]) {
[self setValue:9];
}
objective-c
switch-statement
James Raitsev
fonte
fonte
Respostas:
Infelizmente eles não podem. Esta é uma das melhores e mais procuradas utilizações de instruções de switch, por isso espero que elas entrem no (agora) Java (e outros) movimento!
Se você estiver fazendo nomes de cartões, talvez atribua a cada objeto de cartão um valor inteiro e ative-o. Ou talvez um enum, que é considerado um número e, portanto, pode ser ativado.
por exemplo
Feito dessa maneira, Ace seria igual ao caso 0, Dois como caso 1, etc.
fonte
CardType
não pode ser igual a qualquer fechado@""
por exemplo:[CardType isEqualToString:@"Three"]
Você pode configurar um dicionário de blocos, assim:
Para ter uma seção 'padrão', substitua a última linha por:
Espero que a Apple ensine 'trocar' alguns novos truques.
fonte
Para mim, uma maneira fácil e agradável:
fonte
Infelizmente, as instruções switch podem ser usadas apenas em tipos primitivos. Você tem algumas opções usando coleções, no entanto.
Provavelmente, a melhor opção seria armazenar cada valor como uma entrada em um NSDictionary.
fonte
Um pouco tarde, mas para qualquer pessoa no futuro eu consegui fazer isso funcionar para mim
fonte
Aqui está a maneira mais inteligente de escrever isso. É para usar um
NSNumberFormatter
no "estilo explicativo" :Observe que o formatador de números deseja que a sequência seja minúscula; portanto, precisamos fazer isso antes de passá-la ao formatador.
fonte
Existem outras maneiras de fazer isso, mas
switch
não é uma delas.Se você tiver apenas algumas strings, como no seu exemplo, o código que você possui está correto. Se você tiver muitos casos, poderá armazenar as strings como chaves em um dicionário e procurar o valor correspondente:
fonte
POR MUITO TEMPO .. meu "ObjC Add-On" favorito é
ObjectMatcher
E funciona com não-strings, DEMASIADO ... em loops, até!
O melhor de tudo é que existem SO poucos
{...}
,:
s e()
sfonte
O objetivo-c não é diferente de c nesse aspecto, ele só pode ativar o que c pode (e os defprocs são como NSInteger, NSUInteger, pois eles acabam sendo digitados em um tipo integral).
Wikipedia:
sintaxe c :
Tipos integrais :
fonte
Estou um pouco atrasado para a festa, mas para responder à pergunta como indicado , há uma maneira mais inteligente:
Observe que
indexOfObject
procurará a correspondência usandoisEqual:
, exatamente como na pergunta.fonte
Com base na idéia do @Graham Perks postada anteriormente, projetamos uma classe simples para tornar a troca de strings bastante simples e limpa.
Você usaria assim:
O bloco correto será executado de acordo com a string.
Gist para esta solução
fonte
Não posso comentar a resposta de cris na resposta @Cris, mas gostaria de dizer que:
Existe uma LIMITAÇÃO para o método @ cris:
typedef enum não aceita valores alfanuméricos
Então aqui está outro:
Link Stack over flow Vá para esta resposta de usuário "user1717750"
fonte
Desfrute de codificação .....
fonte