2013-05-17 43 views
2

我有JSON字符串,有时看起来像这样@“2,18,27,29”叫做mayString。其他时候,这个字符串将只是@“2”(一个数字,没有逗号分隔)RangeOfString崩溃找不到结果iOS

我想测试如果字符串包含使用下面的代码逗号:

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

回答

3

尝试下面的代码......因为马辛是正确的...

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

     else{ 

      NSLog (@"Substring not found"); 
     } 
+0

是的,这工作有点垃圾,JSON会做,我从来没有想过它会这样做。我期望如果我声明并想要一个字符串,我得到一个字符串不是一个数字......但我总是在学习。干杯 –

+0

....干杯...还检查@ dasblinkenlight的答案..这是一个聪明的做法... – BhushanVU

5

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

+0

其杰福一个字符串(非原子,强)的NSString * mayString的技能; –

+0

您的属性可能被定义为NSString,但是当您将JSON数据转换为基础对象时,不带逗号的字符串将被解释为数字。 –

+0

+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 

即使myStringNSNumber前上方的分配,它会在它之后是NSString,无论它的初始类型如何。但是,保持原始类型通常是更好的方法。

+0

当然不是当它声明为一个字符串,看起来像一个字符串别人的成功发现,不会被发现其他时间没有? –

+0

@AlexMcPherson它声明的内容对编译器不感兴趣。 Objective C不是一种强类型语言,你可以给'NSString'分配一个'NSNumber',编译器不会在意。当数据看起来不像数字时,JSON解析器将返回一个字符串。 – dasblinkenlight

+0

非常感谢您的解释,酷!我也赞成你。 –

1

如果您在JSON值只有一个号码,NSJSONSerializer始终将其转换为NSNumber的。所以你的NSString实际上是NSNumber。你可以用isKindOfClass检查:

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

编辑:对不起重复的答案,我的写作不是那么好

+0

是的,你们是对的我不知道这个谢谢队友! –