Будет напечатано 40: два вызова first возвращают 10 и 20, а первый вызов second возвращает 10.
Какой будет вывод программы №25
Будет напечатано 40: два вызова first возвращают 10 и 20, а первый вызов second возвращает 10.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вопрос: какой результат выведет следующая Swift‑программа?
func a() -> () -> Int {
var counter = 0
let closure: () -> Int = {
counter += 10
return counter
}
return closure
}
let first = a()
let second = a()
print(first() + first() + second())
Определите, какое число будет напечатано на консоли после выполнения кода.
Ответ
Будет напечатано 40: два вызова first возвращают 10 и 20, а первый вызов second возвращает 10.
Каждый вызов функции a создаёт собственную переменную counter, срок жизни которой продолжается благодаря возвращённому closure. Два обращения к first используют одно и то же сохранённое состояние, поэтому второе уже видит результат первого. second создан отдельным вызовом a и имеет независимый счётчик. Сумма равна 10 + 20 + 10, а не 30 и не 60.