3

是否可以使用块在 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++;
}];

我很难理解这将如何实现......

4

1 回答 1

3

在这里你有几个想法,

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

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

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

问题是,如果您通过发送评估条件来创建包装器,正如您在问题中所述,您将无法在每次迭代中更改其 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类型修饰符,否则会进入死循环。

我没有测试过这个,我希望这对你有帮助。

干杯

于 2011-09-02T19:08:58.853 回答