2

只要循环不包含语句,循环中的循环变量的值是否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

4

3 回答 3

2

另一种解决方案是检查通过特定测试的数组对象。您似乎在第一次出现时就中断了,所以我也只能得到一个索引。如果您想要所有匹配项,则可以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];
}
于 2013-09-24T10:48:38.090 回答
1

你应该改用这个:

id correctItem = nil;
for (id item in items) {
    if (item matches some criteria) {
        correctItem = item;
        break;
    }
}
于 2013-09-24T10:48:13.613 回答
1

启用 ARC 后,无论您在何处创建它们,您的 Objective-C 对象指针变量都将设置为 nil。 [资源]

如果您不使用 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
于 2013-09-24T11:00:24.467 回答