在這裏,你有一對夫婦的想法,
假設你的布爾包裝器實現boolValue,一個天真的實現可能是:
-(void) whileTrueDo:(void (^)(void)) block{
while ([self boolValue]) {
block();
}
}
爲了使包裝器在每次迭代後更改其布爾值,塊必須能夠實際更改用於計算布爾條件的變量。所以,就你而言,通過設置__block類型修飾符進行計數,並在每個塊執行中增加計數,你應該能夠使其工作。
問題是,如果您通過發送評估條件來創建包裝,就像您在問題中指出的那樣,您將無法在每次迭代中更改其布爾值。所以,我會改變包裝器的創建方式和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類型修飾符,否則您將進入無限循環。
我還沒有測試過,我希望這可以幫助你。
乾杯
來源
2011-09-02 19:08:58
Lio