¿Hay alguna forma más inteligente de reescribir esto?
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
fuente
fuente
Respuestas:
Lamentablemente no pueden. Esta es una de las mejores y más buscadas utilizaciones de declaraciones de cambio, ¡así que espero que se suban al (ahora) tren de Java (y otros)!
Si está haciendo nombres de tarjetas, quizás asigne a cada objeto de tarjeta un valor entero y actívelo. O quizás una enumeración, que se considera como un número y, por lo tanto, se puede activar.
p.ej
Hecho de esta manera, Ace sería igual al caso 0, Dos como el caso 1, etc.
fuente
CardType
no puede ser igual a ninguno incluido,@""
por ejemplo:[CardType isEqualToString:@"Three"]
Podrías configurar un diccionario de bloques, como este:
Para tener una sección 'predeterminada', reemplace la última línea con:
Esperemos que Apple le enseñe a 'cambiar' algunos trucos nuevos.
fuente
Para mí, una manera fácil y agradable:
fuente
Desafortunadamente, las declaraciones de cambio solo pueden usarse en tipos primitivos. Sin embargo, tiene algunas opciones para usar colecciones.
Probablemente la mejor opción sería almacenar cada valor como una entrada en un NSDictionary.
fuente
Un poco tarde, pero para cualquiera en el futuro pude hacer que esto funcione para mí
fuente
Aquí está la forma más inteligente de escribir eso. Es usar un
NSNumberFormatter
en el "estilo de deletreo" :Tenga en cuenta que el formateador de números quiere que la cadena esté en minúsculas, por lo que tenemos que hacerlo nosotros mismos antes de pasarla al formateador.
fuente
Hay otras formas de hacerlo, pero
switch
no es una de ellas.Si solo tiene algunas cadenas, como en su ejemplo, el código que tiene está bien. Si tiene muchos casos, puede almacenar las cadenas como claves en un diccionario y buscar el valor correspondiente:
fuente
POR MUCHO ... mi "Complemento ObjC" FAVORITO es
ObjectMatcher
Y funciona con sin cadenas, también ... en bucles, incluso!
Lo mejor de todo es que hay TAN pocos
{...}
's,:
' s y()
'sfuente
Objective-c no es diferente de c en este aspecto, solo puede activar lo que c puede (y los def de preproc como NSInteger, NSUInteger, ya que en última instancia están simplemente definidos como tipo integral).
Wikipedia:
c sintaxis :
Tipos integrales :
fuente
Llego un poco tarde a la fiesta, pero para responder la pregunta como se dijo , hay una manera más inteligente:
Tenga en cuenta que
indexOfObject
buscará la coincidencia utilizandoisEqual:
, exactamente como en la pregunta.fuente
Basándose en la idea de @Graham Perks publicada anteriormente, diseñó una clase simple para hacer que el cambio de cadenas sea bastante simple y limpio.
Lo usarías así:
El bloque correcto se ejecutará de acuerdo con la cadena.
Gist para esta solución
fuente
No puedo comentar sobre la respuesta de cris en @Cris answer pero me gustaría decir que:
Hay una LIMITACIÓN para el método de @ cris:
typedef enum no tomará valores alfanuméricos
Así que aquí hay otro:
Enlace apilado sobre flujo Ir a esta respuesta de usuario "user1717750"
fuente
Disfruta de la codificación .....
fuente