如何用Obj-C块实现whileTrue控制流方法?

时间:2011-09-02 18:43:12

标签: objective-c oop control-flow objective-c-blocks message-passing

是否可以在Objective-C中使用块实现类似Smalltalk样式的whileTrue:方法?具体而言,而不是:

int count = 0;
while (count < 10)
{
  NSLog(count);
  count++;
}

我希望能够做到(通过名为OOBoolean的bool原语上的包装器)... ...

__block int count = 0;
[[OOBoolean booleanWithBool: count < 10] whileTrueDo: ^() {
  NSLog(count);
  count++;
}];

我很难理解如何实现这一点......

1 个答案:

答案 0 :(得分:3)

这里有几个想法,

假设你的bool包装器实现了boolValue,一个天真的实现可能是:

-(void) whileTrueDo:(void (^)(void)) block{
    while ([self boolValue]) {
        block();
    }
}

为了使包装器在每次迭代后更改其bool值,该块必须能够实际更改用于计算布尔条件的变量。因此,在您的情况下,通过将__block类型修饰符设置为count,并在每个块执行中增加计数,您应该能够使其工作。

问题是,如果您通过发送评估条件来创建包装器,正如您在问题中所述,您将无法在每次迭代中更改其bool值。所以,我会改变包装器的创建方式和whileTrueDo:naive实现,这样布尔包装器就会使用一个评估块。

   __block int count = 0;
    OOBooleanBlock evaluationBlock =  ^BOOL{
        return count < 10;
    };
    [[OOBoolean booleanWithBlock:evaluationBlock] whileTrueDo: ^() {
        NSLog(count);
        count++;
    }];

//In OOBoolean 
+(OOBoolean*) booleanWithBlock:(OOBooleanBlock) evaluationBlock{
//Instantiate, set the evaluationBlock ivar and return the ooboolean object.
} 

-(void) whileTrueDo:(void (^)(void)) block{
    while (self.evaluationBlock()) {
        block();
    }
}

请记住使用__block类型修饰符,否则您将进入无限循环。

我没有对此进行测试,但我希望这可以帮助你。

干杯