назначение объекта NSNumber объекту NSString не вызовет никаких ошибок или предупреждений - PullRequest
0 голосов
/ 10 октября 2011

Я поместил объект 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;

После запуска приведенного выше кода я обнаружил, чтоtest, объявленный как (NSString *) - __NSCFNumber.Почему это произошло и почему компилятор не выдал предупреждение или ошибки?Должен ли я иметь конструктор NSString, такой как NSStringWithFormat ..., чтобы сохранить тест как экземпляр NSString?

1 Ответ

5 голосов
/ 10 октября 2011

Причина, по которой это не сработало или не предупредило вас, состоит в том, что 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];
...