Utilisation de "Switch"

CathyGYM

Membre actif
28 Novembre 2010
160
1
Bonsoir,
Une question bête... J'essaie de d'utiliser un switch avec une NSString, au lieu d'un integer, mais apparemment cela ne fonctionne pas.
Y-a-t-il une solution pour faire un test multiple comme celui-ci ?

Bloc de code:
	switch (*chaine) {
		case @"A":
			// Code si chaine vaut "A"
			break;
		case @"B":
			// Code si chaine vaut "B"
			break;
		case @"C":
			// Code si chaine vaut "C"
			break;
		default:
			break;
	}

Merci d'avance. :D
 
Non, pas possible. En langage C, switch ne fonctionne qu'avec des entiers.
Tu peux bien sûr utiliser des if([string isEqualToString:@"A"]) etc.

Personnellement, cela ne m'a jamais manqué: comparer des chaînes est lent, c'est une mauvaise habitude issue des langages de scripts.

Tu peux sans doute remplacer les chaînes par des entiers en nommant les constantes:

Bloc de code:
typedef enum {
	Janvier = 1,
	Fevrier,
	Mars,
	Avril,
	Mai,
	Juin,
	Juillet,
	Aout,
	Septembre,
	Octobre,
	Novembre,
	Decembre
} Mois ;
 
Merci beaucoup Céroce, justement c'était pour convertir en nombre une donnée de mois que je reçois sous une forme pas très standard... J'avais opté pour cette solution mais je ne trouvais pas çà très propre...

Bloc de code:
-(int)moisNum:(NSString *)moisString{
	int moisNum=0;
	if ([moisString isEqual:@"Jan"]) {
		moisNum=1;
	}
	if ([moisString isEqual:@"Feb"]) {
		moisNum=2;
	}
	if ([moisString isEqual:@"Mar"]) {
		moisNum=3;
	}
	if ([moisString isEqual:@"Apr"]) {
		moisNum=4;
	}
	if ([moisString isEqual:@"May"]) {
		moisNum=5;
	}
	if ([moisString isEqual:@"Jun"]) {
		moisNum=6;
	}
	if ([moisString isEqual:@"Jul"]) {
		moisNum=7;
	}
	if ([moisString isEqual:@"Aug"]) {
		moisNum=8;
	}
	if ([moisString isEqual:@"Sep"]) {
		moisNum=9;
	}
	if ([moisString isEqual:@"Oct"]) {
		moisNum=10;
	}
	if ([moisString isEqual:@"Nov"]) {
		moisNum=11;
	}
	if ([moisString isEqual:@"Dec"]) {
		moisNum=12;
	}
	return moisNum;
}
 
Bloc de code:
NSArray* ar = [NSArray arrayWithObjects:@"Jan", @"Fev", @"Mar", @"Avr", @"Mai", @"Jun", @"Jul", @"Aou", @"Sep", @"Oct", @"Nov", @"Dec", nil];
int i = [ar indexOfObject: moisString]; // +1 ?

Mais c'est bien sûr !!!
Génial, c'est effectivement beaucoup plus propre. Je ne connaissais pas indexOfObject
Merci beaucoup :up::up::up:
 
Désolé, mais je suis quasiment sûr que ce code ne fonctionne pas. Voici pourquoi:

Bloc de code:
NSString *chaine0 = @"Avr";
NSString *chaine1 = @"Avr";	// Même adresse que chaine0
NSString *chaine2 = [@"A" stringByAppendingString:@"vr"];	// Adresse différente de chaine0

if(chaine0 == chaine1)	// Condition vraie

if(chaine0 == chaine2)	// Condition fausse

Si les chaînes d'origine sont des constantes dans ton appli, ça fonctionne. Par contre, si la chaîne n'est pas une constante (par ex. lue depuis un XML), alors ça ne fonctionne pas.
 
Si si, chez moi çà fonctionne, du moins sur le simulateur, je n'ai pas encore fait les certificats pour le tester sur mon iPhone.
Chez moi, les valeurs sont obtenues par des substringFromIndex, et tout se passe bien
Merci encore :zen:
 
Désolé, mais je suis quasiment sûr que ce code ne fonctionne pas. Voici pourquoi:

Bloc de code:
NSString *chaine0 = @"Avr";
NSString *chaine1 = @"Avr";	// Même adresse que chaine0
NSString *chaine2 = [@"A" stringByAppendingString:@"vr"];	// Adresse différente de chaine0

if(chaine0 == chaine1)	// Condition vraie

if(chaine0 == chaine2)	// Condition fausse

Si les chaînes d'origine sont des constantes dans ton appli, ça fonctionne. Par contre, si la chaîne n'est pas une constante (par ex. lue depuis un XML), alors ça ne fonctionne pas.

indexOfObject: ne compare pas les adresses.