2016-06-28 81 views
-3

我想檢查字符串的長度,但是當代碼執行並且命中IF語句時,我得到unrecognized selector爲什麼長度不適用於NSString?

字典中的價值是一個字符串。

NSString * checkString = [myDictionary objectForKey:@"somekey"]; 
    NSLog(@"length: %lu", (unsigned long)[checkString length]); 

if([checkString length] > 0){ 

} 

ERROR從控制檯:

長度:0
[__NSCFNumber長度]:無法識別的選擇發送到實例

爲了簡單:

NSString * checkString = @"my string"; //[myDictionary objectForKey:@"somekey"]; 
    NSLog(@"length: %lu", (unsigned long)[checkString length]); 

    if([checkString length] > 0){ 
} 

長度:9
[__NSCFNumber長度]:無法識別的選擇發送到 實例

爲什麼呢?

+0

嘗試施放[myDictionary objectForKey:@「somekey」]來的NSString或使用字符串在withFormat –

+0

根據到錯誤,它是一個'NSNumber'而不是'NSString'這不是因爲你把它作爲'NSString'轉換成它是'NSString'。但奇怪的是,它正確地記錄了「長度:%lu」,所以問題就在它之後,導致崩潰的代碼是什麼?如果你做'[[myDictionary objectForKey:@「somekey」] isKindOfClass:[NSString class]]返回TRUE? – Larme

+3

如果那是你真實的代碼,那麼這個輸出就沒有意義了。這實際上是你正在運行的真正的代碼複製粘貼到你的問題?你確定NSLog和if語句都指向同一個變量? – dan

回答

3

錯誤提示您的實例不是NSString而是NSNumber。這可能是因爲您在[myDictionary objectForKey:@"somekey"]中存儲了NSNumber

嘗試將[yourValueThatYouThinkItsAString stringValue]放入存儲此值的位置。

我試過你的代碼,我沒有得到錯誤(用@「我的字符串」值)。

你可以嘗試什麼:

NSString *checkString = [[myDictionary objectForKey:@"somekey"] stringValue]; 
NSLog(@"length: %lu", (unsigned long)[checkString length]); 

if([checkString length] > 0){ 

} 

PS:在您的NSLog(),您已經有了一個額外的參數,將其刪除。

+0

不是它的一個NSNumber,它是字典中的一個字符串。 –

+1

不,它不是:)檢查我的編輯。 – AnthoPak

+0

檢查修改後的問題。 –

1

length不適用於NSString*的原因是它不是NSString*。儘管Objective-C無法驗證演員,但字典中的對象是NSNumber*,而不是NSString*。這就是代碼編譯的原因,但無法運行。

[myDictionary objectForKey:@"somekey"]調用返回id,通用對象引用。這就是爲什麼當您執行到NSString*時,Objective-C必須相信您,"somekey"的對象實際上是一個字符串。

它不會在NSLog中失敗,因爲您犯了一個錯誤,導致無法評估長度。更改NSLog看到它失敗:

NSLog(@"length: %lu", (unsigned long)[checkString length]); 

如果你的XCode 7或更高版本,可以使用輕量級的仿製藥,以幫助Objective-C的同類型檢查。您可以指定在你的字典鍵和值對象類型,使編譯器能趕上無效強制轉換爲你:

NSDictionary<NSString*,NSString*> *myDictionary = ... 
+0

那麼爲什麼它NSLog 0,但在IF失敗?字典中的值是一個字符串。 –

+0

請檢查修改後的問題。 –

+0

@Firemarble請檢查修改後的答案。 – dasblinkenlight