可以NSString
在switch
声明中使用吗?
或者只是使用if
/ else if
?
我在我的应用程序中使用这些宏.
#define CASE(str) if ([__s__ isEqualToString:(str)]) #define SWITCH(s) for (NSString *__s__ = (s); ; ) #define DEFAULT SWITCH (string) { CASE (@"AAA") { break; } CASE (@"BBB") { break; } CASE (@"CCC") { break; } DEFAULT { break; } }
switch语句需要整数常量,因此NSString不能在这里使用,所以你似乎必须使用if/else选项.
还有一点是你必须使用isEqualToString:或compare:方法比较NSStrings,所以即使允许指针值用于开关案例,你仍然无法使用它们
作为回应和支持@Cœur的答案..这是同样的事情,但用Xcode 4.4+编写/ clang
/ 无论什么 "文字语法" 更接近简单的urnary if, else
比较(这就是重点,不是...... ..)
NSDictionary *actionD = @{ @"A" : ^{ NSLog(@"BlockA!"); }, @"B" : ^{ NSLog(@"BlockB!"); }}; ((void(^)()) actionD[@"A"])();
BlockA!
或者说,你想根据按钮的标题执行一个选择器......
- (IBAction) multiButtonTarget:button { ((void (^)()) // cast @{ @"Click?" : ^{ self.click; }, @"Quit!" : ^{ exit(-1); }} // define [((NSButton*)button).title]) // select (); // execute }
Quit! ⟹
exit -1
简短,喜欢 w.string = kIvar == 0 ? @"StringA" : @"StringB";
,并且更有用,因为你可以在那里推动积木,甚至没有想到一些可怕的(有限的,复杂的)@selector
!
编辑:这显然是这样构造的:
[@[ @"YES", @"NO", @"SIRPOOPSALOT"] do:^(id maybe) { [maybe isEqual:@"YES"] ? ^{ NSLog(@"You got it!"); }() : [maybe isEqual:@"NO" ] ? ^{ NSLog(@"You lose!!!"); }() : ^{ NSLog(@"Not sure!"); [self tryAgain]; }(); }];
➜ *** You got it! ***
➜ *** You lose!!! ***
➜*** Not sure! ***
我不得不承认,我很尴尬 INTO这种语法愚蠢的.另一个选择是忘记字符串是什么..只是执行它,哈哈...
[ @{ NSApplicationWillBecomeActiveNotification : @"slideIn", NSApplicationDidResignActiveNotification : @"slideOut" } each:^( id key, id obj ) { [w observeObject:NSApp forName:obj calling: NSSelectorFromString ( obj ) ]; }];
或者从UI的角度来看,字面上......
- (IBAction)setSomethingLiterallyWithSegmentedLabel:(id)sender { NSInteger selectedSegment = [sender selectedSegment]; BOOL isSelected = [sender isSelectedForSegment:selectedSegment]; BOOL *optionPtr = &isSelected; SEL fabricated = NSSelectorFromString ([NSString stringWithFormat:@"set%@:",[sender labelForSegment:selectedSegment]]); [self performSelector:fabricated withValue:optionPtr]; }
Switch语句不适用于NSString:它只适用于int.
如果/ Else语句代码太多而且通常不是最佳的.
最佳解决方案是使用由NSString(或其他对象)可能性索引的NSDictionary.然后直接访问正确的值/功能.
例1,当你想测试@"A"或@"B"并执行methodA或methodB时:
NSDictionary *action = @{@"A" : [NSValue valueWithPointer:@selector(methodA)], @"B" : [NSValue valueWithPointer:@selector(methodB)], }; [self performSelector:[action[stringToTest] pointerValue]];
例2,当你想测试@"A"或@"B"并执行blockA或blockB时:
NSDictionary *action = @{@"A" : ^{ NSLog (@"Block A"); }, @"B" : ^{ NSLog (@"Block B"); }, }; ((void (^)())action[stringToTest])();