Я новичок в программировании, особенно в языке Swift. Я пытаюсь напечатать строку, содержащую функцию печати (использую интерполяцию строк).
Я не понимаю, почему я получил странный вывод из этого фрагмента кода:
func newFunc() {
print("I print a message")
}
print("Function said: \(newFunc())")
Я получил следующий вывод:
I print a message
Function said: ()
Сообщение, которое было вызвано функцией, было выполнено до слов «Функция сказала:». Я знаю, что могу использовать return внутри функции, чтобы получить правильный вывод, или использовать переменную для хранения этой строки, но я хочу понять, почему я получил результат, описанный выше.
Заранее спасибо!
Я думаю, просмотр стеков вызовов поможет вам лучше понять эту концепцию. По сути, когда вы вызываете свой основной метод (единственный оператор печати), main() помещается в стек. Когда функция находится в стеке, она не извлекается до тех пор, пока не будет выполнена до завершения. Поскольку ваш вызов newFunc() происходит до завершения main, newFunc помещается поверх main в стеке вызовов. newFunc() печатает, завершает и извлекается. Таким образом, main делает то же самое.
Если вопрос «почему вывод не выглядит как Function said: I print a message
?», то простое решение — изменить код на следующий
func newFunc() {
return "I print a message"
}
print("Function said: \(newFunc())")
Здесь вы увидите, что метод newFunc() ничего не печатает, а возвращает значение вызывающей его функции main().
Вы обрабатываете newFunc()
так, как будто он возвращает полезный результат (что-то, что вы можете интерполировать в "Function said: \(here)"
. Но он ничего не возвращает, что в Swift эквивалентно возврату Void.
Void
— это тип, который моделирует возврат ничего. Это эквивалентно пустому кортежу ()
. Если функция не объявляет явный тип возвращаемого значения (например, newFunc()
), то она ведет себя так, как если бы она объявила возвращаемый тип Void
. Каждый раз, когда выполнение функции, возвращающей void, достигает конца своего тела, это как если бы в конце было неявное return
или return ()
. Итак, более явно написанный ваш код ведет себя так:
func newFunc() -> Void {
print("I print a message")
return ()
}
print("Function said: \(newFunc())")
Отсюда, надеюсь, должно быть понятно, почему вы получаете результат, который видите.
Вместо этого вы, вероятно, захотите, чтобы newFunc()
возвращал полезное значение и интерполировал его в вашу строку. Вот так:
func newFunc() -> String {
return "I print a message" // Actually, no you don't, you return a message.
}
print("Function said: \(nenFunc())")
Большое спасибо! "стеки вызовов" - это именно то, что я искал.