RangeOfString在找不到结果iOS时崩溃

时间:2013-05-17 13:02:30

标签: ios nsstring

我有来自JSON的字符串,有时看起来像@“2,18,27,29”,名为mayString。其他时候这个字符串只是@“2”(一个数字,没有逗号分隔)

我想使用以下代码测试字符串是否包含逗号:

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 个答案:

答案 0 :(得分:5)

看起来像你的"字符串"实际上是NSNumber的一个实例。

答案 1 :(得分: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在上面的作业之前是NSNumber,它也会在NSString之后,无论其初始类型如何。但是,保持原始类型通常是一种更好的方法。

答案 2 :(得分:3)

尝试以下代码......因为Marcin是对的......

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

        else{

            NSLog (@"Substring not found");
        }

答案 3 :(得分:1)

如果您在JSON中的值只有一个数字,NSJSONSerializer总是将其转换为NSNumber。所以你的NSString实际上是NSNumber。您可以使用isKindOfClass检查它:

if([mayString isKindOfClass:[NSNumber class]) {
   // do something
}

编辑:抱歉重答,我的写作技巧不太好