是否可以在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++;
}];
我很难理解如何实现这一点......
答案 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类型修饰符,否则您将进入无限循环。
我没有对此进行测试,但我希望这可以帮助你。
干杯