[英]Why does loading an NSArray from pList turn my array into an 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;
}
我的列表只是鍵:Item0字符串“ blah”。 所以是的,有點像字典,但是為什么我不能使用我創建的NSArray對象呢? 自動類型轉換是什么?
該行:
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
來獲取表示字典中元素的一種或另一種數組。
你寫:
我的列表只是鍵:Item0字符串“ blah”
那是字典。 NSDictionary
和NSDictionary
通常沒有順序,它們通過鍵值進行訪問。
NSArray
不能是NSDictionary
,反之亦然,它們是不同的類型。 這不是您的“ plist加載方法”,而是plist
自身,即創建plist
的方式。
plist
的頂部元素可以是數組或字典,並且在加載時確定它是NSDictionary
還是NSArray
。
在Xcode或文本編輯器中查看plist可以幫助您了解正在發生的事情。 使用NSLog()
查看加載的plist,這還將提供對plist
實際結構的深入了解。
您可能會發現,有一個頂級詞典,其中包含您要查找的數組作為詞典項。 或者,您想要的數據確實是一個字典,您將需要使用NSDictionary=
方法訪問所需的項目。
檢查您的清單? 確保那里實際上不是NSDictionary。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.