Objective c 将NSNumber对象分配给NSString对象赢得';不要引起任何错误或警告
我将NSNumber对象放入NSDictionary对象中,然后弹出并将其分配给声明为NSString实例的变量Objective c 将NSNumber对象分配给NSString对象赢得';不要引起任何错误或警告,objective-c,ios,cocoa,nsobject,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, NSStringF
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*)的测试类型是uu NSCFNumber。为什么会发生这种情况,为什么编译器没有给出警告或错误?
我是否必须使用NSString构造函数,例如NSStringWithFormat…,才能将测试作为NSString的实例?之所以没有失败或警告您,是因为
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];
此操作未失败或未向您发出警告的原因是
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];
欢迎来到动态键入的世界。可能的副本:欢迎来到动态键入的世界。可能的副本: