2

我的字符串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

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

即使myStringNSNumber上面的赋值之前,它也会NSString在它之后,不管它的初始类型如何。但是,保留原始类型通常是更好的方法。

于 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 回答
1

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

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

编辑:对不起重复的答案,我的写作技巧不太好

于 2013-05-17T13:12:05.033 回答