Основы замыканий
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 38 из 56.
Замыкание — это самодостаточный блок кода, который можно передавать и вызывать позже. Полный синтаксис определяет типы параметров и возвращаемого значения:
let double = { (n: Int) -> Int in
return n * 2
}
print(double(5)) // 10Swift может выводить типы, когда контекст ясен, поэтому длинную форму записи используют редко. Внутри map, filter и т. д. сокращенная форма записи является нормой:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // самая короткая запись, $0 — это первый аргументЗамыкания — это значения, вы можете сохранять их в переменных, возвращать их из функций и передавать их в качестве аргументов. Именно поэтому работает map.
Задание
ЛегкоПрочитайте две строки входных данных:
- Целое число
x - Список целых чисел, разделенных запятыми
Определите три замыкания, каждое типа (Int) -> Int:
addXприбавляетxк своему аргументуsquareвозвращает аргумент, возведенный в квадратnegateвозвращает аргумент с противоположным знаком
Примените каждое замыкание к каждому элементу списка, используя map. Выведите три строки, по одной на каждое замыкание, с результатами, разделенными ,:
addX: ...
square: ...
negate: ...Для входных данных 10 в первой строке и 1,2,3 во второй строке, вывод будет следующим:
addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3Шпаргалка
Замыкание (closure) — это самодостаточный блок кода, который можно сохранять и передавать. Полный синтаксис:
let double = { (n: Int) -> Int in
return n * 2
}Замыкания могут сохраняться в переменных и передаваться в качестве аргументов (например, в map). Swift выводит типы из контекста, что позволяет использовать сокращенную запись:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // $0 — это первый аргументПопробуйте сами
let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: определите три замыкания (Int) -> Int и примените map к nums через каждое из них
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря