2012-02-28 36 views
2

這是我的問題:我將plist加載到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字符串 「嗒嗒」。所以,它有點像字典,但爲什麼我不能使用我創建的NSArray對象?什麼是自動類型轉換?

+1

你可以在你創建airportList的地方顯示代碼嗎? – jonkroll 2012-02-28 23:32:34

+2

你如何儲存plist,你如何加載它? – Felix 2012-02-28 23:33:22

+0

我在編輯中添加了我的plist加載方法。 @Zaph我聲明瞭一個NSArray,而不是一個NSDictionary。我知道一個NSDictionary也可以是一個NSArray,但我不明白爲什麼,如果是這種情況,我不能使用objectAtIndex訪問我的NSArray的內容。 – Mokgra 2012-02-29 00:45:12

回答

0

你寫:

我的plist就是關鍵:Item0字符串 「嗒嗒」

這是一本字典。 NSDictionary和字典一般沒有訂單,它們通過關鍵值訪問。

NSArray不能是NSDictionary,反之亦然,它們是不同的類型。這不是你的「plist加載方法」,而是它自己的plistplist的創建方式。

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

查看Xcode中的plist或文本編輯器將幫助您瞭解正在發生的事情。使用NSLog()查看加載的plist,這也將提供洞察plist的實際結構。

你可能會發現,有一個頂級字典有你正在尋找的字典項目的數組。或者你想要的數據確實是一本字典,你需要使用NSDictionary=方法來訪問你需要的項目。

0

線:

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

不「您的plist加載到數組」,它負載無論對象是在你的plist和到該基準分配給NSArray *類型的指針。

在Objective-C對象中是無類型的。程序員爲了便於閱讀而使用類型化的指針,以便編譯器可以提供適當的警告。

儘管如此,id類型是可用的,它表示一個無類型的對象。任何類型都可以分配給idid對象可以分配給任何其他類型。在這些情況下,編譯器無法檢查你在做什麼靜態,所以你需要使用自己的判斷。

在這種情況下,你的plist清楚地包含一個字典。所以NSPropertyListSerialization加載並返回一個字典,因爲它可能返回任何屬性類型,類型爲id。簡單地將它存儲爲NSArray *不會影響其在內存中的類型。

也許你想拿字典和allKeysallValues來獲得一個數組代表字典中的元素的方式或其他。

0

檢查你的plist?確保它實際上不是一個NSDictionary。