我已将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的实例?
答案 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];