Значение переменной цикла после цикла for в Objective C

Значение переменной цикла в for - in цикл гарантированно будет nil после выполнения цикла, пока цикл не содержит break заявление? Например, я хотел бы написать код, подобный следующему:

NSArray *items;
NSObject *item;
for (item in items) {
   if (item matches some criterion) {
      break;
   }
}
if (item) {
   // matching item found. Process item.
}
else {
   // No matching item found.
}

Но этот код зависит от item устанавливается на nil когда for цикл проходит весь путь без break,

3 ответа

Решение

Вместо этого вы должны использовать это:

id correctItem = nil;
for (id item in items) {
    if (item matches some criteria) {
        correctItem = item;
        break;
    }
}

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

NSUInteger index = [items indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    if (/* check the item*/) {
        *stop = YES;
    }
}];

if (index == NSNotFound) {
    // no match was found
} else {
    // at least one item matches the check
    id match = items[index];
}

При включенном ARC переменные указателя объекта Objective-C будут установлены в ноль независимо от того, где вы их создали. [Источник]

Если вы не используете ARC, вы можете явно присвоить указателю значение nil:

NSArray *items;
NSObject *item = nil;  //<- Explicitly set to nil
for (item in items) {
   if (item matches some criterion) {
      break;
   }
}
if (item) {
   // matching item found. Process item.
}
else {
   // No matching item found.
}

Я не знаю точного случая, но не могли бы вы просто сделать это, выполняя работу внутри цикла for:

NSArray *items;
NSObject *item; //Doesn't really matter about item being set to nil here.
for (item in items) {
   if (item matches some criterion) 
   {
       // matching item found. Process item.
      break;
   }
}
//Don't have to worry about item after this
Другие вопросы по тегам