NSNumber не приводится правильно и интерпретируется как NSCFString? - PullRequest
3 голосов
/ 02 февраля 2012

Я перебираю массив чисел, поступающих через вызов API:

[6000, 6001, 2000], например

Вот мой код:

    for(NSNumber* arrayID in array){                               
        NSManagedObject *ent = [NSEntityDescription insertNewObjectForEntityForName:@"Genre" inManagedObjectContext:self.managedObjectContext];
        [ent setValue:arrayID forKey:@"genreID"]; 
        [ent setValue:name forKey:@"genreName"];
        [mySet addObject:ent];
    }

При установке arrayID (который является NSNumber в моих основных данных), я получаю сбой:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "genreID"; desired type = NSNumber; given type = __NSCFString; value = 6002.'

Это как если бы arrayID не был приведен как NSNumber?Xcode говорит, что это NSNumber, когда я его набираю, но если я, например, добавлю [arrayID doubleValue], Xcode скажет мне, что 'doubleValue не может быть отправлено для типа' id '

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

То, что вы объявили arrayID как указатель NSNumber, не гарантирует, что объект arrayID на самом деле является NSNumber.В этом случае массив, по-видимому, состоит из NSString s.

В Objective-C типы объектов на самом деле являются только подсказками для компилятора, вы можете приводить что угодно к чему угодно и вызывать любой метод дляобъект, эти вещи только фактически терпят неудачу во время выполнения.Вам нужно будет посмотреть, где был создан array, чтобы увидеть, какой тип на самом деле.

В этом случае, если все они на самом деле являются строками, вы можете сделать

for(NSString* arrayID in array){                               
    NSManagedObject *ent = [NSEntityDescription insertNewObjectForEntityForName:@"Genre" inManagedObjectContext:self.managedObjectContext];
    [ent setValue:[NSNumber numberWithInt:[arrayID intValue]] forKey:@"genreID"]; 
    [ent setValue:name forKey:@"genreName"];
    [mySet addObject:ent];
}
1 голос
/ 02 февраля 2012

Как вы создаете свой массив? Похоже, он действительно содержит NSStrings, а не NSNumbers.

...