2013-09-15 5 views
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; 
}} 

Я хочу, чтобы иметь возможность перезапустить этот метод до тех пор, если положение не не соблюдается. Однако, когда я пытаюсь выполнить этот код, я получаю сообщение об ошибке: «Контроль может доходить до конца не-void-функции». Как мне это сделать?

+0

Определение «перезагрузка». У вас есть рекурсивный вызов, но он не возвращает результат, следовательно, сообщение об ошибке. Вы могли бы просто добавить 'return' перед' [self returnIncorrectDef]; ', но вы рискуете« бесконечной »рекурсией. Было бы разумнее просто окружить тело цикла контуром, который будет только выйти, когда будут выполнены ваши условия выхода. –

+0

(Хотя петлевый подход почти наверняка приведет к «бесконечному циклу». Но по крайней мере он не потерпит крах.) –

+0

... но приложение будет безответственным и «зависает» (если это ничуть лучше, чем авария). Поэтому вставьте код в свой код – Mario

ответ

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, вы используете рекурсию, которая потенциально может привести к сбою программы, если вы держите «недостающее» вашу цель (что, конечно, возможно).

+0

, если 'определения' не являются массивом' NSString' (и мы не можем сказать, что это так), '[NSString stringWithFormat: @"% @ ", ...]' не так бессмысленно – medvedNick

+0

@medvedNick Ах, это хороший момент. – trojanfoe

+0

Следует отметить, что определение «определений» недоступно, и если оно не является (по крайней мере) «изменчивым», бесконечный цикл почти гарантирован. –

2

Решение trojanfoe лучше, но проблема заключается в том, что вы никогда не возвращаете значение, которое получаете при входе в систему. Меняющийся эта строку в

return [self returnIncorrectDef]; 

должен решить проблему

+0

Это вызовет рекурсию. Это хорошая идея? – trojanfoe

+1

Лучшая причина предложить мое решение в том, что это минимальное изменение, необходимое для решения ошибки, которую он получает, поэтому неплохо демонстрировать ПОЧЕМУ компилятор заботился об ошибке в первую очередь (чтобы он мог ее найти в следующий раз). Ваше решение с итерацией - это гораздо более эффективное, более легкое для чтения и более чистое решение, но для этого требуется переписывающая логика, заслоняя ошибку, которую он имел в первую очередь. –

+0

За исключением того, что вышеупомянутое «решение», скорее всего, приведет к таинственному сбою, который полностью опровергнет ОП. –

0

Вместо [self returnIncorrectDef]; просто сделать: return [self returnIncorrectDef];

Таким образом, вы возвращаете значение рекурсивно вызывая вашу функцию. Убедитесь, что параметры оценки изменить, хотя, чтобы предотвратить бесконечный цикл,

EDIT, но это не может быть то, что вы хотите в этом конкретном случае (вызов метода снова и снова)

+0

Это вызовет рекурсию. Это хорошая идея? – trojanfoe

+0

В принципе могут быть полезны рекурсивные функции. Это зависит от того, что на самом деле ожидается в коде. Но это ответ на вопрос о «перезапуске функции» – Mario

+0

И у них нет * любых * недостатков? – trojanfoe

Смежные вопросы