Swift에서 클로저(Closure)는 일급 객체로서, 코드 블록을 감싸고, 변수나 상수에 저장하거나 함수의 매개변수로 전달하거나 함수의 반환 값으로 사용할 수 있는 독립적인 코드 조각입니다. 클로저는 다른 말로 익명 함수 또는 람다 함수라고도 불립니다.
클로저는 주로 함수 내에서 조작 또는 처리해야 하는 코드를 간결하게 나타내는 데 사용됩니다. Swift에서 클로저는 다음과 같이 세 가지 주요 형태로 나타납니다.
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
함수 내부에 정의된 클로저
func makeIncrementer(incrementAmount: Int) -> (Int) -> Int {
func incrementer(number: Int) -> Int {
return number + incrementAmount
}
return incrementer
}
이름 없이 코드 블록만 포함하는 클로저입니다. 주로 다른 함수의 인자로 전달하거나 변수/상수에 저장됩니다.
let addClosure: (Int, Int) -> Int = { (a, b) in
return a + b
}
클로저는 {}(중괄호)를 사용하여 정의되며, 입력 매개변수와 반환 타입은 클로저 표현식 또는 함수의 매개변수로 전달될 때 컴파일러에 의해 유추될 수 있으므로 일반적으로 생략됩니다. 예를 들어:
let multiply: (Int, Int) -> Int = { $0 * $1 }
위의 코드에서 $0와 $1은 클로저의 입력 매개변수를 나타냅니다. 클로저 표현식을 사용하면 간결한 코드를 작성할 수 있습니다.
클로저는 주로 배열의 map, filter, reduce와 같은 고차 함수(higher-order function)와 함께 사용되어 컬렉션을 조작하고 데이터를 처리하거나 비동기 작업을 처리하는 데 유용합니다.
let numbers = [1, 2, 3, 4, 5]
// 배열의 각 요소를 제곱하여 새로운 배열을 생성
let squaredNumbers = numbers.map { $0 * $0 }
// 배열에서 짝수만 필터링하여 새로운 배열을 생성
let evenNumbers = numbers.filter { $0 % 2 == 0 }
// 배열의 모든 요소를 더하여 합을 계산
let sum = numbers.reduce(0) { $0 + $1 }
print(squaredNumbers) // [1, 4, 9, 16, 25]
print(evenNumbers) // [2, 4]
print(sum) // 15