2012-01-21 26 views
0

將plist加載到NSArray後,我試圖訪問它的嵌套數組。for(NSArray * a in directory)does not working,像我所期望的那樣

NSArray *tree = [[NSArray alloc] initWithContentsOfFile:path]; 
for (NSArray *a in tree) 
{ 
    //Let's assume object at index 0 is always NSString 
    NSLog(@"Returning the string: %@ ", [a objectAtIndex:0]); 
} 

從調試器的一些值:

tree __NSCFArray * 0x6856cf0 
    0 __NSCFString * 0x6818b70 
    1 __NSCFString * 0x682be10 
    2 __NSCFArray * 0x6856cd0 

所以我期待的語句跳過第2個NSString的,然後與NSArray的執行。

不過步進一行: 一個__NSCFString * 0x6818b70

和弔臂,APPCRASH。

小貼士?

+1

指定確切的錯誤消息(可能是未捕獲的異常),你會得到幫助。 – NSGod

回答

6

所以我期待for語句跳過前兩個NSString,然後用NSArray執行。

這不是for (NSArray *a in tree)表達式的作用。該語句創建NSArray *類型的名爲a的局部變量,並將其指定爲引用tree中的每個對象,而不管特定索引處的對象是否爲NSArray。

你快速列舉環大致等同於:

NSArray *a; 
for (NSInteger index = 0; index < [tree count]; index++) { 
    a = [tree objectAtIndex:index]; 
    ... 
} 

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html

5

約拿已經指出的那樣,只是告訴你期待一個NSArray實際上並沒有使一個編譯器。如果你想跳過不在你的循環數組的對象,你可以如下做到這一點:

for (NSArray *a in tree) { 
    if (![a isKindOfClass:[NSArray class]]) continue; 
    //... 
} 
0

由於OMZ &約拿人士指出您for循環不會也選擇項目只需指定的類型a。這裏是另一個變化,它使元素可能不是陣列:

for (id element in tree) 
{ 
    // skip non-arrays 
    if (![element isKindOfClass:[NSArray class]]) continue; 

    NSArray *a = (NSArray *)element; 
    ... 
} 
+0

這和omz的一樣。爲什麼甚至再次發佈? –

+0

@ChristianBeer - omz將元素提取到「NSArray *」類型的變量中,然後檢查這是否有效;上面的代碼將元素提取到一個'id'類型的變量中,這個變量是有效的,並且只有當它是一個數組時,它纔會被賦值給一個類型爲'NSArray *'的變量。尤其是考慮到這個問題涉及對類型的混淆,對它們的謹慎似乎是明智和清晰的;爲什麼將一些東西分配給一個'NSArray *'知道它可能不是那種類型? – CRD