2015-12-08 2 views
2

Я не понимаю, почему у вас не может быть указатель охраны внутри возвращаемой функции.Как вы помещаете инструкцию охраны в функцию в Swift?

func sayHello(text: String?) -> String { 
    guard let whatever = text else { 
     ... 
     return 
    } 
    return "aString" 
} 

Почему это неправильно? Xcode дает мне ошибку «функция non-void должна возвращать значение» в операторе return в закрытии guard, так как он считает, что оператор return является оператором return. Как вы проводите различие между оператором guardreturn и оператором return?

То же самое происходит в обработчиках заканчивания, которые не возвращают:

func anotherFunction() -> Bool { 
    aFunction("hello", completion: { (status) -> Void in 
     if status == "good" { 
      return true // I want anotherFunction() to return this not the handler 
     } else { 
      return false 
     } 
    }) 
} 

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

Думаю, я понимаю, почему вы не можете сделать это в примере обработчика завершения, но вы обязательно должны иметь инструкцию охраны внутри не-void-функции. Я попробовал заменить return (в примере guard) с break и continue, ни один из которых не работал.

Спасибо!

ответ

11

Весь смысл здесь ... вы не можете вернуться внутрь выполнения обработчика завершения. Во втором случае, если вы хотите вернуть логическое значение результата вашего обработчика завершения, вам придется создать локальную переменную, установить ее в результате обработчика и затем вернуть ее за пределы обработчика. Что касается первой проблемы, с которой вы столкнулись, Xcode жалуется, потому что вы объявили функцию как возвращающую строку, но в своем заявлении else вы пытаетесь вернуть void, что нарушает возвращаемый тип функции. Вы можете делать то, что вы пытаетесь сделать, но вам нужно вернуть хотя бы пустую строку.

+0

Если я возвращаю пустую строку, это означает, что функция прекратит выполнение. Что делать, если я просто хочу выполнить из инструкции охраны, но не из всей функции? – Jake

+1

Затем оставьте 'else' пустым. Никакого кода, ничего не выполнить, двигаться дальше. Но я был бы упущен, если бы не заметил, что это делает заявление о бесполезности. Это должно быть для проверки целостности ваших данных, но если вы проверите его, и результат не увенчается успехом, но затем вы хотите продолжить выполнение, я не вижу точки охраны в первую очередь. – pbush25

+0

Вы не можете оставить его пустым. У охранника должен быть контроль передачи. – Jake

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