循环执行后,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
。
答案 0 :(得分: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];
}
答案 1 :(得分:1)
你应该改用:
id correctItem = nil;
for (id item in items) {
if (item matches some criteria) {
correctItem = item;
break;
}
}
答案 2 :(得分:1)
启用ARC后,无论您在何处创建它们,Objective-C对象指针变量都将设置为nil。 [Source]
如果您不使用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