для (NSArray * a в каталоге) не работает, как я ожидал - PullRequest
0 голосов
/ 21 января 2012

После загрузки plist в NSArray я пытаюсь получить доступ к его вложенным массивам.

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 строки NSS и затем выполнить с NSArray.

Однако шагая в одну строку: a __NSCFString * 0x6818b70

И boom, appcrash.

Советы?

Ответы [ 3 ]

6 голосов
/ 21 января 2012

Так что я ожидаю, что оператор for пропустит первые 2 строки NSS и затем выполнится с NSArray.

Это не то, что делает выражение for (NSArray *a in tree).Этот оператор создает локальную переменную с именем a типа NSArray * и назначает ее для ссылки на каждый объект в 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 голосов
/ 21 января 2012

Как уже говорил Иона, просто сказать компилятору, что вы ожидаете, что NSArray на самом деле не делает его одним.Если вы хотите пропустить объекты, которые не являются массивами в вашем цикле, вы можете сделать это следующим образом:

for (NSArray *a in tree) {
    if (![a isKindOfClass:[NSArray class]]) continue;
    //...
}
0 голосов
/ 21 января 2012

Как отметили omz & Jonah, ваш цикл for также не выбирает элементы, просто указывая тип a.Вот еще один вариант, который дает понять, что элементы не могут быть массивами:

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

   NSArray *a = (NSArray *)element;
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...