Значение переменной цикла после цикла 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