我有以下代码:
- (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子句。但是,当我尝试此代码时,我收到一条错误消息:“控制可能会达到非空函数的结束”。我该怎么做?
答案 0 :(得分: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
声明。
请注意,(请参阅@ medvedNick的评论 - 如果该类不是[NSString stringWithFormat:@"%@",...]
是一个无意义的陈述,并且已经简化。NSString
类,则没有意义)。
重要:如果没有while
循环,您正在使用递归,如果您一直“遗漏”目标,这可能会导致程序崩溃(这当然是可能的)。
答案 1 :(得分:2)
trojanfoe的解决方案更好,但您遇到的问题是您永远不会返回重新输入时获得的值。那条线到了
return [self returnIncorrectDef];
应解决问题
答案 2 :(得分:0)
而不是[self returnIncorrectDef];
只需:
return [self returnIncorrectDef];
通过递归调用函数返回值。确保评估参数发生变化,以防止无限循环
编辑,但在这种特殊情况下可能不是您想要的(一遍又一遍地调用方法)