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

min*_*end 0 cocoa objective-c nsobject ios

我已将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;
Run Code Online (Sandbox Code Playgroud)

运行上面的代码后,我发现声明为(NSString*)的测试类型是__NSCFNumber.为什么会发生这种情况以及为什么编译器没有给出警告或错误?我是否必须使用NSString构造函数,例如NSStringWithFormat ...,以便将测试保持为NSString的实例?

Joe*_*Joe 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];
Run Code Online (Sandbox Code Playgroud)