Почему загрузка NSArray из pList превращает мой массив в NSDictionary? - PullRequest
2 голосов
/ 29 февраля 2012

Вот моя проблема: я загружаю plist в NSArray. Я не объявляю ни одного NSDictionary в моем приложении.

Теперь у меня есть UIPickerView. Я хочу, чтобы он был заполнен из указанного NSArray, который является приватным членом моего контроллера представления Мой сборщик требует реализации метода titleForRow. Если я реализую это так, это вылетает:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [airportList objectAtIndex:row];    
}

Однако, если я реализую это так, это работает:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSDictionary *stupid = (NSDictionary *)airportList;
NSString *airPortName = [stupid objectForKey:[NSString stringWithFormat:@"Item%d",row]];
NSLog(@"%@",airPortName);
return airPortName;   
}

Почему мой NSArray автоматически преобразуется в NSDictionary?

Редактировать *: Вот как я генерирую свой NSArray из plist:

-(NSArray *)createAirportList
{
   NSString *path = [[NSBundle mainBundle] pathForResource:@"AirportList" ofType:@"plist"];
   NSData *plistAirportNames = [NSData dataWithContentsOfFile:path];
   NSString *error;
   NSPropertyListFormat format;    
   NSArray *airportNames = [NSPropertyListSerialization propertyListFromData:plistAirportNames mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 
   if(!airportNames)
   {
       NSLog(@"Could not read the airport name. Error:%@",error);
   }
   return airportNames;   
}

Мой список просто ключевой: Item0 string "blah". Так что да, это словно словарь, но почему я не могу использовать созданный мной объект NSArray? Что с автонастройкой?

Ответы [ 3 ]

0 голосов
/ 29 февраля 2012

Вы пишете:

Мой список просто ключевой: Item0 string "blah"

Это словарь. NSDictionary и словари в общем случае не имеют порядка, они доступны по значению ключа.

NSArray не может быть NSDictionary и наоборот, это разные типы. Это не ваш «метод загрузки списка», а plist сам по себе, способ, которым был создан plist.

Верхний элемент plist может быть либо массивом, либо словарем, и он определяет, является ли он NSDictionary или NSArray при загрузке.

Просмотр списков в Xcode или текстовом редакторе поможет вам понять, что происходит. Используйте NSLog() для просмотра загруженного списка, который также предоставит представление о фактической структуре plist.

Что вы можете найти, так это то, что существует словарь верхнего уровня, в котором есть массив, который вы ищете как элемент словаря. Или что данные, которые вы хотите, действительно являются словарем, и вам нужно будет использовать NSDictionary= методы для доступа к нужному элементу.

0 голосов
/ 01 марта 2012

Проверьте свой список?Убедитесь, что это не NSDictionary там.

0 голосов
/ 29 февраля 2012

Строка:

NSArray *airportNames = [NSPropertyListSerialization 
                            propertyListFromData:plistAirportNames 
                            mutabilityOption:NSPropertyListImmutable 
                            format:&format errorDescription:&error]; 

не «загружает ваш plist в массив», она загружает любой объект из вашего plist и присваивает ссылку на него указателю типа NSArray *.

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

Тем не менее, доступен тип id, который обозначает нетипизированный объект.Любой тип может быть назначен id, а id объектам - любой другой тип.В этих случаях компилятор не может проверить, что вы делаете статически, поэтому вам нужно использовать собственное суждение.

В этом случае ваш plist явно содержит словарь.Так что NSPropertyListSerialization загружает и возвращает словарь типа id, поскольку он может возвращать любой тип свойства.Простое сохранение его как NSArray * не влияет на его тип в памяти.

Возможно, вы хотите взять словарь и вызвать allKeys или allValues, чтобы получить массив, представляющий элементы в словаре в одну сторонуили другой.

...