我有以下代码:

- (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子句。但是,当我尝试这段代码时,我收到一条错误消息:“控件可能会到达非void函数的结尾”。我该怎么做?

最佳答案

使用带有标志的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循环,您正在使用递归,如果您继续“丢失”目标,这可能会导致程序崩溃(这确实有可能)。

10-07 23:12