1

我有以下代码:

- (NSString*)returnIncorrectDef {
NSInteger defIndex = [self randomIndex];

NSString *incorrectDef = [NSString stringWithFormat:@"%@", [definitions objectAtIndex:defIndex]];

if (([incorrectDef isEqualToString:self.definitionString]) || ([incorrectDef isEqualToString:def1.titleLabel.text])) {
    // I want to restart the method here
    [self returnIncorrectDef];
} else {
    return incorrectDef;
}}

我希望能够重新启动此方法,直到不满足 if 子句。但是,当我尝试此代码时,我收到一条错误消息:“控件可能到达非无效函数的结尾”。我该怎么做?

4

3 回答 3

2

使用while带有标志的循环:

- (NSString*)returnIncorrectDef {
    BOOL done = NO;
    NSString *incorrectDef = nil;
    while (!done) {
        NSInteger defIndex = [self randomIndex];
        incorrectDef = [definitions objectAtIndex:defIndex];
        done = !([incorrectDef isEqualToString:self.definitionString] ||
                 [incorrectDef isEqualToString:def1.titleLabel.text]);
    }
    return incorrectDef;
}

也可以使用do ... while语句。

请注意,这[NSString stringWithFormat:@"%@",...]是一个毫无意义的陈述,并且已被简化。(请参阅@medvedNick 的评论 - 如果该课程不是NSString课程,那并不是毫无意义的)。

重要提示:如果没有while循环,您正在使用递归,如果您一直“错过”您的目标(这当然是可能的),这可能会使您的程序崩溃。

于 2013-09-15T19:26:40.700 回答
2

trojanfoe 的解决方案更好,但是您遇到的问题是您永远不会返回重新输入时获得的值。将该行更改为

return [self returnIncorrectDef];

应该解决问题

于 2013-09-15T19:31:00.230 回答
0

而不是[self returnIncorrectDef];简单地做: return [self returnIncorrectDef];

这样你就可以通过递归调用你的函数来返回一个值。确保评估参数发生变化,以防止无限循环

编辑,但这可能不是您在这种特殊情况下想要的(一遍又一遍地调用该方法)

于 2013-09-15T19:32:55.480 回答