3

在Objective-C中使用塊可以實現類似Smalltalk樣式的whileTrue:方法嗎?具體來說,而不是:如何使用Obj-C模塊實現True控制流方法?

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

我希望能夠做到操作(即在布爾的包裝原始稱爲OOBoolean)類似...

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

我唔明如何做到這一點,雖然實現...

回答

3

在這裏,你有一對夫婦的想法,

假設你的布爾包裝器實現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類型修飾符,否則您將進入無限循環。

我還沒有測試過,我希望這可以幫助你。

乾杯

相關問題