我有来自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
答案 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
}
编辑:抱歉重答,我的写作技巧不太好