gpt4 book ai didi

objective-c - 如何使用 Obj-C Blocks 实现 whileTrue 控制流方法?

转载 作者:搜寻专家 更新时间:2023-10-30 20:11:25 24 4
gpt4 key购买 nike

是否可以使用 block 在 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++;
}];

虽然我无法理解这将如何实现...

最佳答案

这里你有几个想法,

假设您的 bool 包装器实现了 boolValue,一个天真的实现可能是:

-(void) whileTrueDo:(void (^)(void)) block{
while ([self boolValue]) {
block();
}
}

为了让包装器在每次迭代后更改其 bool 值,该 block 必须能够实际更改用于计算 bool 条件的变量。因此,在您的情况下,通过将 __block 类型修饰符设置为计数,并在每个 block 执行中增加计数,您应该能够使其工作。

问题是,如果您通过发送评估条件来创建包装器,正如您在问题中所述,您将无法在每次迭代中更改其 bool 值。因此,我将更改包装器的创建方式和 whileTrueDo: naive 实现,以便 bool 包装器使用评估 block 。

   __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类型修饰符,否则会进入死循环。

我还没有测试过这个,但我希望这对你有帮助。

干杯

关于objective-c - 如何使用 Obj-C Blocks 实现 whileTrue 控制流方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com