您可以NSDictionary
将命令名称直接映射到代码,无论是选择器、调用还是块。就像是:
NSMutableDictionary *actions = [NSMutableDictionary dictionary];
[actions setObject:^{
[self getParam1];
[self getParam2];
[self navigateSomewhere];
} forKey:@"openPage1"];
进而:
dispatch_block_t action = [actions objectForKey:command];
if (action) {
action();
} else {
/* handle unknown command */
}
当然,字典只会被初始化一次,然后被缓存。如果操作始终是同一个调用,只是使用不同的参数,您可以将命令名称直接映射到参数:
// setup:
NSDictionary *commandsToPages = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:1], @"command1",
/* more mappings */,
nil];
// …and later:
NSNumber *pageNumber = [commandsToPages objectForKey:commandName];
[self displayPage:[pageNumber intValue]];
如果可能的话,还可以选择仅解析命令名称以提取页码。
PS。从 LLVM 4.1 (?) 开始,您还可以使用速记文字语法来创建动作字典,这样看起来会更容易一些:
NSDictionary *actions = @{
@"command1" : ^{
…
},
@"command2" : ^{
…
},
};
请注意,即使第二个命令块之后的尾随逗号也有效。