将NSNumber对象分配给NSString对象不会导致任何错误或警告

时间:2011-10-10 13:36:17

标签: objective-c ios cocoa nsobject

我已将NSNumber对象放入NSDictionary对象,然后弹出并将其分配给声明为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构造函数,例如NSStringWithFormat ...,以便将测试保持为NSString的实例?

1 个答案:

答案 0 :(得分: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];