Vous pourriez mettre en place un dictionnaire de blocs, comme ceci:
NSString *lookup = @"Hearts"; // The value you want to switch on
typedef void (^CaseBlock)();
// Squint and this looks like a proper switch block!
// New ObjC syntax makes the NSDictionary creation cleaner.
NSDictionary *d = @{
@"Diamonds":
^{
NSLog(@"Riches!");
},
@"Hearts":
^{
self.hearts++;
NSLog(@"Hearts!");
},
@"Clubs":
^{
NSLog(@"Clubs");
},
@"Spades":
^{
NSLog(@"Spades");
}
};
((CaseBlock)d[lookup])(); // invoke the correct block of code
Cette alternative simple ne prend pas en charge "par défaut", ni de l'automne, et il va se bloquer si la valeur de la recherche n'est pas trouvé. Afin d'éviter l'accident, et avoir un peu de code par défaut, la dernière ligne pourrait être:
CaseBlock c = d[lookup];
if (c) c(); else { NSLog(@"Joker"); }
Espérons qu'Apple va enseigner "switch" quelques nouveaux trucs, que cette solution n'est pas vraiment jolie (si réalisable).
Edit: j'ai remplacé cette ancienne syntaxe de code avec la nouvelle syntaxe ci-dessus. L'ancienne syntaxe:
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
^() { NSLog(@"case 1"); }, @"1",
^() { NSLog(@"case 2"); }, @"2",
^() { NSLog(@"case 3"); }, @"3",
^() { NSLog(@"case 4"); }, @"4",
nil];