Что здесь делает print()? (Печать функции, которая вызывает другую функцию печати)

#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. Большое вам спасибо! «стеки вызовов» — это именно то, что я искал.