Как реализовать метод потока управления whileTrue с блоками Obj-C? - PullRequest
3 голосов
/ 02 сентября 2011

Возможно ли реализовать в Objective-C что-то вроде Smalltalk-стиля с использованием блоков?В частности, вместо:

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

Я хотел бы иметь возможность (через оболочку для примитива bool, называемого OOBoolean) что-то вроде ...

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

I 'У меня проблемы с пониманием, как это будет реализовано, хотя ...

1 Ответ

3 голосов
/ 02 сентября 2011

Здесь у вас есть пара идей,

Предполагая, что ваша оболочка 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.

Я не проверял это, надеюсь, это поможет вам, хотя.

Приветствия

...