Захват значений
Часть раздела Логика и управление потоком путешествия по Swift на Coddy. Урок 40 из 56.
Замыкание запоминает переменные, которые находились в области видимости в момент его создания. Тело замыкания может позже читать их и даже изменять, в том числе после завершения окружающей функции. Это называется захватом.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3Каждый вызов makeCounter даёт вам совершенно новый count, поэтому два счётчика никогда не используют общее состояние:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2Захват делает замыкания мощнее обычных функций: они сохраняют состояние вместе с собой. Вы увидите тот же приём в JavaScript, Python и многих других языках.
Задание
СреднеСоздайте небольшую фабрику счётчиков.
Определите функцию makeCounter(start: Int, step: Int), которая возвращает замыкание типа () -> Int. Каждый вызов замыкания возвращает следующее значение: первый вызов возвращает start, следующий — start + step, следующий — start + 2*step и так далее.
Считайте из входных данных три целых числа: start, step и n. Создайте счётчик с start и step, затем вызовите его n раз и выведите каждый результат в отдельной строке.
Для входных данных 5 / 3 / 4 результатом будет:
5
8
11
14Попробуйте сами
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: makeCounter(start:step:) -> () -> Int, который захватывает текущее значение
// затем вызовите её n раз и выведите каждый результат
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаряПотренируйтесь самостоятельно: Песочница Swift