Здесь у вас есть пара идей,
Предполагая, что ваша оболочка 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, иначе вы войдете в бесконечное числоloop.
Я не проверял это, надеюсь, это поможет вам, хотя.
Приветствия