2013-05-17 38 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

是的,你們是對的我不知道這個謝謝隊友! –