为什么从pList加载NSArray会将我的数组转换为NSDictionary?

时间:2012-02-28 23:19:59

标签: ios exception ios5 nsarray nsdictionary

这是我的问题:我将一个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?

编辑*: 这是我如何从plist生成我的NSArray:

-(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;   
}

我的plist只是键:Item0字符串“blah”。所以,它有点像字典,但为什么我不能使用我创建的NSArray对象?什么是自动类型转换?

3 个答案:

答案 0 :(得分:0)

该行:

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

没有“将你的plist加载到数组中”,它会加载plist中的任何对象,并将其引用分配给NSArray *类型的指针。

在Objective-C对象中是无类型的。程序员使用类型指针来提高可读性,以便编译器可以提供合适的警告。

尽管如此,id类型可用,它代表一个无类型的对象。可以将任何类型分配给id,并且可以将id个对象分配给任何其他类型。在这些情况下,编译器无法检查您正在静态执行的操作,因此您需要使用自己的判断。

在这种情况下,你的plist显然包含一本字典。所以NSPropertyListSerialization加载并返回字典,类型为id,因为它可能返回任何属性类型。简单地将其存储为NSArray *不会影响其在内存中的类型。

可能你想拿字典并调用allKeysallValues来获得一个数组,以一种方式表示字典中的元素。

答案 1 :(得分:0)

你写道:

  

我的plist只是键:Item0字符串“blah”

这是一本字典。 NSDictionary和字典一般没有订单,可以通过键值访问它们。

NSArray不能是NSDictionary,反之亦然,它们是不同的类型。这不是你的“plist加载方法”,而是plist它自己,就像创建plist一样。

plist的顶部元素可以是数组或字典,并且在加载时确定它是NSDictionary还是NSArray

查看Xcode中的plist或文本编辑器将帮助您了解正在发生的事情。使用NSLog()查看已加载的plist,还可以深入了解plist的实际结构。

您可能会发现有一个顶级字典,其中包含您要查找的数组作为字典项。或者您想要的数据确实是字典,您需要使用NSDictionary=方法来访问所需的项目。

答案 2 :(得分:0)

检查你的plist?确保它实际上不是NSDictionary。