在这里你有几个想法,
假设你的 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类型修饰符,否则会进入死循环。
我没有测试过这个,我希望这对你有帮助。
干杯