Tho*_*son 53 objective-c switch-statement nsstring
可以NSString在switch声明中使用吗?
或者只是使用if/ else if?
小智 69
我在我的应用程序中使用这些宏.
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
Vla*_*mir 53
switch语句需要整数常量,因此NSString不能在这里使用,所以你似乎必须使用if/else选项.
还有一点是你必须使用isEqualToString:或compare:方法比较NSStrings,所以即使允许指针值用于开关案例,你仍然无法使用它们
Ale*_*ray 12
作为回应和支持@Cœur的答案..这是同样的事情,但用Xcode 4.4+编写/ clang/ 无论什么 "文字语法" 更接近简单的urnary if, else比较(这就是重点,不是...... ..)
NSDictionary *actionD = @{ @"A" : ^{ NSLog(@"BlockA!"); },
@"B" : ^{ NSLog(@"BlockB!"); }};
((void(^)()) actionD[@"A"])();
Run Code Online (Sandbox Code Playgroud)
BlockA!
或者说,你想根据按钮的标题执行一个选择器......
- (IBAction) multiButtonTarget:button {
((void (^)()) // cast
@{ @"Click?" : ^{ self.click; },
@"Quit!" : ^{ exit(-1); }} // define
[((NSButton*)button).title]) // select
(); // execute
}
Run Code Online (Sandbox Code Playgroud)
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]; }();
}];
Run Code Online (Sandbox Code Playgroud)
➜ *** 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 ) ];
}];
Run Code Online (Sandbox Code Playgroud)
或者从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];
}
Run Code Online (Sandbox Code Playgroud)
Cœu*_*œur 10
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]];
Run Code Online (Sandbox Code Playgroud)
例2,当你想测试@"A"或@"B"并执行blockA或blockB时:
NSDictionary *action = @{@"A" : ^{ NSLog (@"Block A"); },
@"B" : ^{ NSLog (@"Block B"); },
};
((void (^)())action[stringToTest])();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52482 次 |
| 最近记录: |