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" : ^{
…
},
};
2 番目のコマンド ブロックの後の末尾のコンマも機能することに注意してください。