Menu
Coddy logo textTech

Основы замыканий

Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 38 из 56.

Замыкание — это самодостаточный блок кода, который можно передавать и вызывать позже. Полный синтаксис определяет типы параметров и возвращаемого значения:

let double = { (n: Int) -> Int in
    return n * 2
}
print(double(5))                  // 10

Swift может выводить типы, когда контекст ясен, поэтому длинную форму записи используют редко. Внутри map, filter и т. д. сокращенная форма записи является нормой:

let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 }    // самая короткая запись, $0 — это первый аргумент

Замыкания — это значения, вы можете сохранять их в переменных, возвращать их из функций и передавать их в качестве аргументов. Именно поэтому работает map.

challenge icon

Задание

Легко

Прочитайте две строки входных данных:

  1. Целое число x
  2. Список целых чисел, разделенных запятыми

Определите три замыкания, каждое типа (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 через каждое из них
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком