Closure (замыкание) - это автономный блок функциональности, который может быть передан и использован в вашем коде. По сути, это функция без имени, которая может захватывать константы и переменные из окружающего контекста.
// Полная форма
let sum = { (a: Int, b: Int) -> Int in
return a + b
}
// Сокращенная форма
let sumShort: (Int, Int) -> Int = { $0 + $1 }
// Функция
func multiply(a: Int, b: Int) -> Int {
return a * b
}
// Closure
let multiplyClosure = { (a: Int, b: Int) -> Int in
return a * b
}
Closure могут захватывать и хранить ссылки на переменные из окружающего контекста:
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += incrementAmount
return total
}
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
incrementByTwo() // 2
incrementByTwo() // 4
Closure часто используются для обработки завершения асинхронных операций:
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(error))
} else if let data = data {
completion(.success(data))
}
}.resume()
}
let numbers = [1, 2, 3, 4]
let squared = numbers.map { $0 * $0 } // [1, 4, 9, 16]
// Escaping пример
var completions: [() -> Void] = []
func storeCompletion(_ completion: @escaping () -> Void) {
completions.append(completion)
}
// Autoclosure пример
func logIfTrue(_ predicate: @autoclosure () -> Bool) {
if predicate() {
print("True")
}
}
logIfTrue(2 > 1)
// Trailing closure пример
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
}
closures в Swift - это мощный инструмент для создания гибкого и модульного кода. Они отличаются от функций способностью захватывать контекст, более лаконичным синтаксисом и широким применением в асинхронных операциях и функциональном программировании. Понимание closures критически важно для современной iOS-разработки.