2011-10-10 36 views
0

我已經將NSNumber對象放入NSDictionary對象,然後彈出並將其分配給一個聲明爲NSString實例的變量。將NSNumber對象分配給NSString對象不會導致任何錯誤或警告

NSString *test; 
NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1000] forKey:@"key"]; 

test = [dict valueForKey:@"key"]; 
NSLog(@"%@, type of %@", test, NSStringFromClass([test class])); 

return 0; 

運行上述代碼後,我發現聲明爲(NSString *)的測試類型是__NSCFNumber。爲什麼會發生,爲什麼編譯器沒有提供警告或錯誤? 爲了保持測試爲NSString的實例,是否必須使用NSString構造函數,例如NSStringWithFormat ...?

+1

歡迎來到動態打字的世界。 – tobiasbayer

+0

可能的重複:http://stackoverflow.com/questions/4357063/what-is-the-class-nscfnumber-in-ios-4-1 –

回答

5

這並沒有失敗或警告你的原因是因爲valueForKey:返回一個id類型的對象,你可以將它分配給任何Objective-C類型。你需要知道你從你的收藏中獲得什麼類型的價值來安全地使用它們。在這種情況下,你知道它包含一個NSNumber,所以你應該期待一個NSNumber,如果你需要一個字符串,你將需要做適當的轉換。

NSNumber *test = [dict valueForKey:@"key"]; 
NSLog(@"%@, type of %@", test, NSStringFromClass([test class])); 

//If you need a string 
NSString *testStr = [test stringValue]; 
相關問題