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 type修飾子をcountに設定し、各ブロックの実行でcountを増やすことで、それを機能させることができるはずです。

問題は、質問で述べたように、評価された条件を送信してラッパーを作成した場合、各反復でそのbool値を変更できないことです。したがって、ラッパーの作成方法とwhileTrueDo:ナイーブな実装を変更して、ブールラッパーが評価ブロックを使用するようにします。

   __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 type修飾子を使用することを忘れないでください。そうしないと、無限ループに入ります。

私はこれをテストしていませんが、これがお役に立てば幸いです。

乾杯

于 2011-09-02T19:08:58.853 に答える