ページ 11

ObjectiveC 文字列の比較

Posted: 2011年2月28日(月) 01:49
by 紅葉
文字列の比較をしたいのですが上手く行きません。
下記のログを出して落ちてしまいます。
2011-02-28 01:47:01.964 Aozora[1904:207] -[__NSArrayM isEqualToString:]: unrecognized selector sent to instance 0x5f213f0
2011-02-28 01:47:01.966 Aozora[1904:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM isEqualToString:]: unrecognized selector sent to instance 0x5f213f0'

このソースでやっていることは引数の1文字目を見てとある文字列を返す関数があります。
その関数の文字列とmode(変数)が同じ値だったら処理をするといったif文が書きたいです。

コード:

// 文字によって返す文字列を変える
- (NSString*)strReturn:(NSString*)string{
	NSString* chkStr = [[NSString alloc] initWithString:[string substringWithRange:NSMakeRange(0, 1)]];
	
	// 日本語
	if( [chkStr isEqualToString:@"あ"] || [chkStr isEqualToString:@"い"] || [chkStr isEqualToString:@"う"] || [chkStr isEqualToString:@"え"] || [chkStr isEqualToString:@"お"] ) return @"あ行";
	if( [chkStr isEqualToString:@"か"] || [chkStr isEqualToString:@"き"] || [chkStr isEqualToString:@"く"] || [chkStr isEqualToString:@"け"] || [chkStr isEqualToString:@"こ"] ) return @"か行";
	if( [chkStr isEqualToString:@"さ"] || [chkStr isEqualToString:@"し"] || [chkStr isEqualToString:@"す"] || [chkStr isEqualToString:@"せ"] || [chkStr isEqualToString:@"そ"] ) return @"さ行";
	if( [chkStr isEqualToString:@"た"] || [chkStr isEqualToString:@"ち"] || [chkStr isEqualToString:@"つ"] || [chkStr isEqualToString:@"て"] || [chkStr isEqualToString:@"と"] ) return @"た行";
	if( [chkStr isEqualToString:@"な"] || [chkStr isEqualToString:@"に"] || [chkStr isEqualToString:@"ぬ"] || [chkStr isEqualToString:@"ね"] || [chkStr isEqualToString:@"の"] ) return @"な行";
	if( [chkStr isEqualToString:@"は"] || [chkStr isEqualToString:@"ひ"] || [chkStr isEqualToString:@"ふ"] || [chkStr isEqualToString:@"へ"] || [chkStr isEqualToString:@"ほ"] ) return @"は行";
	if( [chkStr isEqualToString:@"ま"] || [chkStr isEqualToString:@"み"] || [chkStr isEqualToString:@"む"] || [chkStr isEqualToString:@"め"] || [chkStr isEqualToString:@"も"] ) return @"ま行";

	// カタカナ
	if( [chkStr isEqualToString:@"ア"] || [chkStr isEqualToString:@"イ"] || [chkStr isEqualToString:@"ウ"] || [chkStr isEqualToString:@"エ"] || [chkStr isEqualToString:@"オ"] ) return @"あ行";
	if( [chkStr isEqualToString:@"カ"] || [chkStr isEqualToString:@"キ"] || [chkStr isEqualToString:@"ク"] || [chkStr isEqualToString:@"ケ"] || [chkStr isEqualToString:@"コ"] ) return @"か行";
	if( [chkStr isEqualToString:@"サ"] || [chkStr isEqualToString:@"シ"] || [chkStr isEqualToString:@"ス"] || [chkStr isEqualToString:@"セ"] || [chkStr isEqualToString:@"ド"] ) return @"さ行";
	if( [chkStr isEqualToString:@"タ"] || [chkStr isEqualToString:@"チ"] || [chkStr isEqualToString:@"ツ"] || [chkStr isEqualToString:@"テ"] || [chkStr isEqualToString:@"ト"] ) return @"た行";
	if( [chkStr isEqualToString:@"ナ"] || [chkStr isEqualToString:@"ニ"] || [chkStr isEqualToString:@"ヌ"] || [chkStr isEqualToString:@"ネ"] || [chkStr isEqualToString:@"ノ"] ) return @"な行";
	if( [chkStr isEqualToString:@"ハ"] || [chkStr isEqualToString:@"ヒ"] || [chkStr isEqualToString:@"フ"] || [chkStr isEqualToString:@"ヘ"] || [chkStr isEqualToString:@"ホ"] ) return @"は行";
	if( [chkStr isEqualToString:@"マ"] || [chkStr isEqualToString:@"ミ"] || [chkStr isEqualToString:@"ム"] || [chkStr isEqualToString:@"メ"] || [chkStr isEqualToString:@"モ"] ) return @"ま行";

	return	@"その他";
}

//strArrayには文字列が入っており2番には「あいうえお」が入っております。
//関数を通して返される文字は「あ行」になります。
//modeにはあ行が入っております。

NSString *str = [[NSString alloc] initWithString:[strArray objectAtIndex:2]];
NSString* chk = [[NSString alloc] initWithString:[self strReturn:str] ];
 if(  [chk isEqual:mode]) 〜処理をしたい〜
どなたかお分かりになる方はおりませんでしょうか。
見にくいソースで申し訳ないですがよろしくお願いします。

Re: ObjectiveC 文字列の比較

Posted: 2011年3月02日(水) 00:50
by めるぽん
パッと見た感じだと、(リークはありますがそれは置いといて)問題は無い気がしますね。
この中に問題があるとすれば、strArray が NSArray* か NSMutableArray* になっていないとか、strArray の中に設定しているのが NSString* でないとか、mode が NSString* でないとかでしょうか。
(自分がバグを見逃してる可能性もありますが)

Re: ObjectiveC 文字列の比較

Posted: 2011年3月02日(水) 23:47
by 紅葉
ご回答ありがとう御座います。
原因が分かりました。
ここではなく別の場所で配列へのアクセスの仕方が悪かったようです。
こんなミスだったとは・・・。

ぬるぽんさんがあっているように思えると書いて頂いたお陰で解決できました。