2

JSONmayString と呼ばれるこの @"2, 18, 27, 29" のような文字列があります。それ以外の場合、この文字列は @"2" (1 つの数字でコンマ区切りなし) になります。

以下のコードを使用して、文字列にコンマが含まれているかどうかをテストしたいと思います。

NSRange range = [mayString rangeOfString:@","];
        if (range.location != NSNotFound) {
            NSLog (@"Substring found at: %d", range.location);
        }

        else{

            NSLog (@"Substring not found");
        }

文字列にコンマ区切りが含まれている場合は正常に動作しますが、コンマがない場合はログに表示されると予想されるがクラッシュしますが"Substring not found"?[__NSCFNumber rangeOfString:]: unrecognized selector sent to instance 0x1d533500

4

4 に答える 4

5

あなたの「文字列」は実際には NSNumber のインスタンスのようです。

于 2013-05-17T13:04:36.950 に答える
4

JSON は型指定されていないため、パーサーは文字列の内容を把握しようとします。文字列がたとえば のように見える場合@"2"、JSON は.NSNumberではなくオブジェクトを返しますNSString。それを変数に割り当てることができNSString *、Objective Cコンパイラは文句を言いませんが、内部の値は残りNSNumberます.

これを修正する方法は次のとおりです。

id myObject = ... // Instead of MSString *myString

if ([myObject isKindOfClass:[NSNumber class]]) {
        NSLog (@"Object is not a string");
} else if ([myObject isKindOfClass:[NSString class]]) {
    NSRange range = [mayString rangeOfString:@","];
    if (range.location != NSNotFound) {
        NSLog (@"Substring found at: %d", range.location);
    } else{
        NSLog (@"Substring not found");
    }
}

次のように、強制的に文字列にすることもできます。

myString = [myString description]; // Not recommended

上記の代入の前でmyStringあっても、初期型に関係なく後になります。ただし、通常は元の型を維持する方が適切な方法です。NSNumberNSString

于 2013-05-17T13:06:26.050 に答える
3

以下のコードを試してください... Marcinが正しいので...

NSRange range = [[NSString stringWithFormat:@"%@",mayString] rangeOfString:@","];
        if (range.location != NSNotFound) {
            NSLog (@"Substring found at: %d", range.location);
        }

        else{

            NSLog (@"Substring not found");
        }
于 2013-05-17T13:07:21.987 に答える