NSStringとswitch
NSStringを比較して条件分岐させる場合、
普通にif-elseを使えばいいわけですが、
switchっぽい書き方になるようなマクロってこんな感じでいいかしら?
まずは、確認のためにif-elseを使うと次みたいな感じですね。
#define ISSAMESTRINGS(STR,ING) [STR isEqualToString:ING] if ( ISSAMESTRINGS(foo,bar) ) { fuga } else if ( ISSAMESTRINGS(foo,hoge) ){ fugafuga } else { hogefuga }
これをマクロ使ってswitchっぽい感じにしてみます。
コードは下に記載。
しかし、あくまでもswitch『っぽい』使い方。
もっとかっこいい方法を思いつく頭が欲しい。
テストはまだしてません(笑)
switchStringを宣言しているところが気になります。
まぁ、同じスコープ内に同じ名前のものを宣言しないようにすればいいのですが、
何かそゆの嫌いです。
#define SWITCH(VAR) \ NSString *switchString = [NSString stringWithString:VAR];\ if ( 0 ) #define CASE(CONSTANT) }else if ([switchString isEqualToString:CONSTANT]) { #define DEFAULT }else{ /** * NSString *str; //何かいれとく */ SWITCH(str) { CASE(@"ST") // 何かする CASE(@"RI") // 何かする CASE(@"NG") // 何かする DEFAULT // 何かする }
switchStringのスコープが気になるので、ちょっと改変。
しかし、SWITCHより上では使えない。
。。。switchStringをメチャクチャな名前にすればよくね?
/* SWITCH(VAR) \ => SWITCH(VAR) {\ #define ENDCASE } を 追加する */ #define SWITCH(VAR) {\ NSString *switchString = [NSString stringWithString:VAR];\ if ( 0 ) #define CASE(CONSTANT) }else if ([switchString isEqualToString:CONSTANT]) { #define DEFAULT }else{ #define ENDCASE } //NSString *switchString; // SWITCHよりも上では使えない SWITCH(str) { CASE(@"ST") // 何かする CASE(@"RI") // 何かする CASE(@"NG") // 何かする DEFAULT // 何かする ENDCASE // ENDCASEじゃなくて普通に"}"をいれてもいいかもね。 } NSString *switchString; // 使える
最初考えたやつ。実際にswitchを使う。caseだけマクロにする。
#define CASE(OBJ) case [OBJ indexOfObject] // NSArray に分岐させたい文字を入れる NSArray *strings = [NSArray arrayWithObjects:@"st",@"ri",@"ng",nil]; int i; for (i=0; i<[strings count]; i++) if ([str isEqualToString:[strings objectAtIndex:i]]) break; switch(i){ CASE(@"st"): break; CASE(@"ri"): break; CASE(@"ng"): break; default: break; }