Swift official document에서는 Closure를 named function을 생성하지 않고 같이 실행하는 Grouped code라고 정의합니다.
클로저 (Closures) | Swift
명명된 함수 생성없이 실행되는 코드 그룹입니다. 클로저 (Closures) 는 코드에서 주변에 전달과 사용할 수 있는 자체 포함된 기능 블럭입니다. Swift의 클로저는 다른 프로그래밍 언어에서 클로저,
bbiguduk.gitbook.io
기본 syntax는 아래와 같습니다.
{ (#parameters#) -> <#return type#> in
<#statements#>
}
전달받은 매개 변수를 변환 타입에 맞춰 반환 후 실행 코드를 반환합니다.
Closure의 유형
- 기본 형태
let greeting = { (name: String) -> String in
return "Hello, \(name)"
}
print(greeting("Jin"))
// Hello, Jin
- 함수의 매개변수로 활용
func performAction(action: () -> Void) {
action()
}
performAction {
print("Action executed!")
}
Void란?
여러 프로그래밍 언어에서 사용되는 개념으로 "아무 것도 없음"을 의미합니다. 이를 통해 특정 함수가 값을 반환하지 않거나, 어떠한 데이터도 가지지 않는 것을 나타낼 수 있습니다.
- 후행 클로저(Trailing closure)
후행 클로져는 함수 호출 시 마지막 매개변수에 Closure를 사용할 때, 소괄호 바깥에 클로저를 작성하는 방식입니다. $0은 Swift의 축약형 코드로 첫번째 매개변수를 의미하여, 아래 코드에서 $0은 numbers의 values 를 나타냅니다. map 함수에서 $0 (numbers의 values)의 값에 각각 2를 곱하라는 의미가 됩니다.
let numbers = [1, 2, 3, 4]
let doubledNumbers = numbers.map() { $0 * 2 }
// 소괄호를 생략해도 무관함
print(doubleNumbers)
// [2, 4, 6, 8]
공식 Document를 봐도 이해가 되지 않아요
A closure is just a function with the parameters moved inside the brackets, with the keyword "in" to seperate the parameter from the function body.
func myFunc(number: Int) -> Int {
let result = number * 3
return result
}
func myClosure -> {(number: Int) -> Int in
let result = 3 * number
return result
}
let x = myFunc(2)
let y = myClosure(2)
print(x) // 6
print(y) // 6
두 코드는 매개변수와 변환 타입의 위치만 다를 뿐 결과 값은 같습니다. numbers라는 array를 호출할 때,
let numbers = [1, 2, 3]
let times3 = numbers.map(myFunc)
let times3_2 = numbers.map(myClosure)
//위 closure 코드는 아래 코드와 같다
let times3_3 = numbers.map({(numbers: Int) -> Int in
let result = number * 3
return result
})
Closure의 특징
- 함수보다 간결하게 작성할 수 있으며 in 키워드를 사용해 매개 변수와 실행 코드를 분리합니다.
- 정의된 컨텍스트(정의한 원래 범위가 존재하지 않더라도)에서 모든 상수와 변수에 대한 참조를 캡쳐(참조 및 수정)하고 저장할 수 있습니다.
'App Development > Swift' 카테고리의 다른 글
Swift의 매개변수(parameter) 정리하기 (0) | 2024.11.30 |
---|---|
Swift에서의 completion (0) | 2024.11.26 |
Swift의 ARC (Automatic Reference Counting) (0) | 2024.11.24 |
Swift에서의 Class (0) | 2024.11.24 |
Swift 분기 처리 정의와 종류 (0) | 2024.11.23 |