簡體   English   中英

為什么從pList加載NSArray會使我的數組變成NSDictionary?

[英]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 *不會影響其在內存中的類型。

可能您想使用字典並調用allKeysallValues來獲取表示字典中元素的一種或另一種數組。

你寫:

我的列表只是鍵:Item0字符串“ blah”

那是字典。 NSDictionaryNSDictionary通常沒有順序,它們通過鍵值進行訪問。

NSArray不能是NSDictionary ,反之亦然,它們是不同的類型。 這不是您的“ plist加載方法”,而是plist自身,即創建plist的方式。

plist的頂部元素可以是數組或字典,並且在加載時確定它是NSDictionary還是NSArray

在Xcode或文本編輯器中查看plist可以幫助您了解正在發生的事情。 使用NSLog()查看加載的plist,這還將提供對plist實際結構的深入了解。

您可能會發現,有一個頂級詞典,其中包含您要查找的數組作為詞典項。 或者,您想要的數據確實是一個字典,您將需要使用NSDictionary=方法訪問所需的項目。

檢查您的清單? 確保那里實際上不是NSDictionary。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM