如何在Objective-C中打破块循环?

4

我有以下这些在头文件中声明:
注:我不会解释整个代码,我认为它很容易理解

typedef void (^loopCell)(id cell);
-(id)allCells:(loopCell)cell;

以下是实现 allCells 函数的代码:

-(id)allCells:(loopCell)cell
{
    for (AAFormSection *section in listSections)
    {
        for (id _cell in section.fields) {
            cell(_cell);
        }
    }
    return nil;
}
allCells函数的使用方法:
-(void)setFieldValue:(NSString *)value withID:(int)rowID
{    
    [self allCells:^(id cell) {
        if([cell isKindOfClass:[AAFormField class]]) {
            AAFormField *_cell = (AAFormField *)cell;
            if(_cell.rowID == rowID) {
                _cell.value = value;
                //return; Here I want to terminate loop
            }
        }
    }];
}

我的问题是,我无法在中途终止 allCells 循环(实际上当我在循环中找到需要的对象时,我不想遍历其他对象)

如何在中途停止 allCells 循环?

2个回答

9

请查看NSArray enumerateObjectsUsingBlock:的文档。它们设置块签名以接受BOOL指针。将停止BOOL设置为YES可导致迭代停止。

typedef void (^loopCell)(id cell, BOOL *stop);

-(id)allCells:(loopCell)cell {
    BOOL stop = NO;
    for (AAFormSection *section in listSections) {
        for (id _cell in section.fields) {
            cell(_cell, &stop);
            if (stop) {
                break;
            }
        }
        if (stop) {
            break;
        }
    }

    return nil;
}

-(void)setFieldValue:(NSString *)value withID:(int)rowID {    
    [self allCells:^(id cell, BOOL *stop) {
        if([cell isKindOfClass:[AAFormField class]]) {
            AAFormField *_cell = (AAFormField *)cell;
            if(_cell.rowID == rowID) {
                _cell.value = value;
                if (stop) {
                    *stop = YES;
                }
            }
        }
    }];
}

谢谢,我一直在考虑类似的方式,现在对我来说更清晰了。 - Almas Adilbek

1

你无法从setFieldValue中退出,但可以从allCells中退出。

取决于调用块的方法 - 在这种情况下是allCells - 是否提供了停止循环的机制。通常,它是块的参数。

如果allCells是您自己的,并且您不介意修改它,则可以修改块签名以获取指向BOOL的指针,初始化为YES,并检查块是否将其修改为NO。

(注意:您可以从for-in循环中break。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接