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

Я новичок в программировании, особенно в языке Swift. Я пытаюсь напечатать строку, содержащую функцию печати (использую интерполяцию строк).

Я не понимаю, почему я получил странный вывод из этого фрагмента кода:

func newFunc() {
    print("I print a message")
}

print("Function said: \(newFunc())")

Я получил следующий вывод:

I print a message
Function said: ()

Сообщение, которое было вызвано функцией, было выполнено до слов «Функция сказала:». Я знаю, что могу использовать return внутри функции, чтобы получить правильный вывод, или использовать переменную для хранения этой строки, но я хочу понять, почему я получил результат, описанный выше.

Заранее спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Большое спасибо! "стеки вызовов" - это именно то, что я искал.

Eugene T. 20.12.2020 23:04

Вы обрабатываете 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())")

Другие вопросы по теме