В ответ и в поддержку ответа @ Cœur. Вот то же самое, но написано в Xcode 4.4+ / clang
/ Каким бы «буквальным синтаксисом», который еще ближе с простой урной 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
}
Выйти! ⟹ 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! ***
Я должен признать, я 'm смущающе INTO этот вид синтаксической глупости.Другой вариант - забыть о том, что это за строка ... просто запустите ее, lol ...
[ @{ NSApplicationWillBecomeActiveNotification : @"slideIn",
NSApplicationDidResignActiveNotification : @"slideOut" } each:^( id key, id obj ) {
[w observeObject:NSApp forName:obj calling: NSSelectorFromString ( obj ) ];
}];
или, взяв слово пользовательского интерфейса, буквально ..
- (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];
}