#swift #printing #swift5
#swift #печать #swift5
Вопрос:
Я новичок в программировании, особенно в языке Swift. Я пытаюсь напечатать строку, содержащую функцию печати (я использую интерполяцию строк).
Я не понимаю, почему я получил странный вывод из этого фрагмента кода:
func newFunc() {
print("I print a message")
}
print("Function said: (newFunc())")
Я получил следующий вывод:
I print a message
Function said: ()
Сообщение, которое было вызвано функцией, было выполнено до того, как «Функция сказала: » слова.
Я знаю, что могу использовать возврат внутри функции для получения правильного вывода или использовать переменную для хранения этой строки, но я хочу понять, почему я получил результат, описанный выше.
Заранее спасибо!
Ответ №1:
Вы работаете newFunc()
так, как будто она возвращает полезный результат (что-то, что вы можете интерполировать "Function said: (here)"
. Но это ничего не возвращает, что в Swift эквивалентно возврату Void
.
Void
это тип, который моделирует возврат ничего. Это эквивалентно пустому кортежу, ()
. Если функция не объявляет явный возвращаемый тип (например, newFunc()
), то она ведет себя так, как если бы она объявила возвращаемый тип 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())")
Ответ №2:
Я думаю, что просмотр стеков вызовов поможет вам лучше понять эту концепцию. По сути, когда вы вызываете свой основной метод (оператор alone print), main() get помещается в стек. Когда функция находится в стеке, она не извлекается, пока не будет запущена до завершения. Поскольку ваш вызов 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() .
Комментарии:
1. Большое вам спасибо! «стеки вызовов» — это именно то, что я искал.