2012-01-21 9 views
0

plistをNSArrayにロードした後、そのネストされた配列にアクセスしようとしています。for(NSArray * a in directory)が期待通りに機能しない

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 NSStringsをスキップし、その後にNSArrayを実行するためのステートメントを期待しています。 __NSCFString * 0x6818b70

とブーム、APPCRASH:

しかし1行ステッピング。

ヒント?

+1

正確なエラーメッセージ(おそらく捕捉されない例外)を指定すると、役立つでしょう。 – NSGod

答えて

6

私は、最初の2つのNSStringをスキップしてから、NSArrayを実行することを期待しています。

これはfor (NSArray *a in tree)の表現ではありません。このステートメントは、NSArray *タイプのaというローカル変数を作成し、特定のインデックスのオブジェクトがNSArrayであるかどうかにかかわらず、treeの各オブジェクトを参照するように割り当てます。

あなたの高速列挙ループはほぼ同等である:ヨナはすでにちょうどあなたがNSArrayが実際にそれ1つとなっていません期待コンパイラに伝える、指摘したように

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

。あなたのループで配列されないオブジェクトをスキップしたい場合は、次のようにそれを行うことができます:

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

関連する問題