Objective-C可以打开NSString吗?

有更聪明的方法来重写这个吗?

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]; } 

不幸的是,他们不能。 这是开关语句最好的和最受欢迎的使用方法之一,所以希望他们能跳上Java(和其他)的stream行语!

如果你正在做卡片名称,也许给每个卡片对象分配一个整数值,然后打开它。 或者也许是一个枚举,这被认为是一个数字,因此可以切换。

例如

 typedef enum{ Ace, Two, Three, Four, Five ... Jack, Queen, King } CardType; 

这样做,Ace将等于情况0,两个作为情况1等。

你可以设置一个块的字典,就像这样:

 NSString *lookup = @"Hearts"; // The value you want to switch on typedef void (^CaseBlock)(); // Squint and this looks like a proper switch! NSDictionary *d = @{ @"Diamonds": ^{ NSLog(@"Riches!"); }, @"Hearts": ^{ self.hearts++; NSLog(@"Hearts!"); }, @"Clubs": ^{ NSLog(@"Late night coding > late night dancing"); }, @"Spades": ^{ NSLog(@"I'm digging it"); } }; ((CaseBlock)d[lookup])(); // invoke the correct block of code 

要有“默认”部分,请将最后一行replace为:

 CaseBlock c = d[lookup]; if (c) c(); else { NSLog(@"Joker"); } 

希望苹果会教授“转换”一些新的技巧。

对我来说,一个简单的方法:

 NSString *theString = @"item3"; // The one we want to switch on NSArray *items = @[@"item1", @"item2", @"item3"]; int item = [items indexOfObject:theString]; switch (item) { case 0: // Item 1 break; case 1: // Item 2 break; case 2: // Item 3 break; default: break; } 

不幸的是,switch语句只能用于原始types。 尽pipe如此,你还是有一些使用集合的选项。

可能最好的select是将每个值作为一个条目存储在NSDictionary中。

 NSDictionary *stringToNumber = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:6],@"Six", [NSNumber numberWithInt:7],@"Seven", [NSNumber numberWithInt:8],@"Eight", [NSNumber numberWithInt:9],@"Nine", nil]; NSNumber *number = [stringToNumber objectForKey:cardName]; if(number) [self setValue:[number intValue]]; 

这是写这个更聪明的方法。 在“拼写风格”中使用NSNumberFormatter

 NSString *cardName = ...; NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; [nf setNumberStyle:NSNumberFormatterSpellOutStyle]; NSNumber *n = [nf numberFromString:[cardName lowercaseString]]; [self setValue:[n intValue]]; [nf release]; 

请注意,数字格式化程序希望string被小写,所以在将它传递给格式化程序之前,我们必须自己做。

还有其他方法可以做到这一点,但switch不是其中之一。

如果你只有几个string,就像在你的例子中,你有的代码是好的。 如果有很多情况,可以将string作为键存储在字典中,并查找相应的值:

 NSDictionary *cases = @{@"Six" : @6, @"Seven" : @7, //... }; NSNumber *value = [cases objectForKey:cardName]; if (value != nil) { [self setValue:[value intValue]]; } 

Objective-c在这方面与c没有什么不同,它只能切换到c能够(和预处理def类似NSInteger,NSUInteger,因为它们最终只是typedef的一个整型)。

维基百科:

c语法 :

switch语句会根据expression式的值( 必须具有整数types)将控件转移到几个语句之一。

积分types :

在计算机科学中,一个整数是一个整数数据types的数据,它是表示math整数有限子集的数据types。 积分数据types可能具有不同的大小,可能或不允许包含负值。

BY FAR .. 我最喜欢的“ObjC附加组件”是ObjectMatcher

 objswitch(someObject) objcase(@"one") { // Nesting works. objswitch(@"b") objcase(@"a") printf("one/a"); objcase(@"b") printf("one/b"); endswitch // Any code can go here, including break/continue/return. } objcase(@"two") printf("It's TWO."); // Can omit braces. objcase(@"three", // Can have multiple values in one case. nil, // nil can be a "case" value. [self self], // "Case" values don't have to be constants. @"tres", @"trois") { printf("It's a THREE."); } defaultcase printf("None of the above."); // Optional default must be at end. endswitch 

它与非string,TOO …循环,甚至工作!

 for (id ifNumericWhatIsIt in @[@99, @0, @"shnitzel"]) objswitch(ifNumericWhatIsIt) objkind(NSNumber) printf("It's a NUMBER.... "); objswitch([ifNumericWhatIsIt stringValue]) objcase(@"3") printf("It's THREE.\n"); objcase(@"99") printf("It's NINETY-NINE.\n"); defaultcase printf("some other Number.\n"); endswitch defaultcase printf("It's something else entirely.\n"); endswitch It's a NUMBER.... It's NINETY-NINE. It's a NUMBER.... some other Number. It's something else entirely. 

最重要的是,有这么几个{...} ,:和()

有点晚了,但是对于将来的任何人来说,我都能够为我工作

 #define CASE(str) if ([__s__ isEqualToString:(str)]) #define SWITCH(s) for (NSString *__s__ = (s); ; ) #define DEFAULT 

我对派对迟了一些,但要回答这个问题 ,有一个更聪明的方法:

 NSInteger index = [@[@"Six", @"Seven", @"Eight", @"Nine"] indexOfObject:cardName]; if (index != NSNotFound) [self setValue: index + 6]; 

请注意, indexOfObject将使用isEqual:来查找匹配,与问题完全相同。

我不能评论克里斯答案@Cris答案,但我想说的是:

@ cris的方法有一个局限性:

typedef枚举不会使用字母数字值

 typedef enum { 12Ace, 23Two, 23Three, 23Four, F22ive ... Jack, Queen, King } CardType; 

所以这里是另一个:

链接堆栈溢出转到此用户答案“user1717750”

 typedef enum { Six, Seven, Eight } cardName; - (void) switchcardName:(NSString *) param { switch([[cases objectForKey:param] intValue]) { case Six: NSLog(@"Six"); break; case Seven: NSLog(@"Seven"); break; case Eight: NSLog(@"Eight"); break; default: NSLog(@"Default"); break; } } 

享受编码…..