循环最多运行一次,(循环增量从不执行)

时间:2014-07-05 13:26:31

标签: objective-c error-handling uipickerview

我有一个选择器视图,我希望它中的东西是飞机的尾号。我使用此代码,但收到警告Loop will run once at most, (loop increment never executed),然后收到错误control may each end of non-void function.这里有什么问题?

CODE:

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    for (NSInteger i = [[NSUserDefaults standardUserDefaults]integerForKey:@"planeNum"]; (i = 0); i--) {
        NSString *dTailNumber = [NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults]objectForKey:[NSString stringWithFormat:@"Plane%liTailNumber", i]]];
        return dTailNumber;
    }
}

2 个答案:

答案 0 :(得分:18)

您收到警告的原因

  

循环最多运行一次,(循环增量从不执行)

是因为你在循环体中有一个无条件的return。在第一次执行循环时,在达到循环增量之前,它将return退出方法。


你得到

的原因
  

控制可能会到达非空函数的末尾

是因为无法保证此功能能够返回任何内容。如果循环执行0次怎么办?然后该方法永远不会返回任何东西,这是不正确的,因为它被声明为返回NSString

答案 1 :(得分:0)

太多想着它了。这很简单(我花了一分钟时间搞清楚了!)

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

    // set a blank string
    NSString *dTailNumber = @"";
    for (NSInteger i = [[NSUserDefaults standardUserDefaults]integerForKey:@"planeNum"]; (i = 0); i--) {
        // no need to declare here now
        dTailNumber = [NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults]objectForKey:[NSString stringWithFormat:@"Plane%liTailNumber", i]]];
        // this is removed from loop
        // return dTailNumber;
    }
    // instead return here
    return dTailNumber;

}

该方法本身将首先确保(self)将返回相应的属性(NSString *)...之前运行任何代码......期间!我总是忘记编译器只需检查所需的一切,然后运行所有内部函数!当你想出来时非常酷!