클로저
클로저 == 함수.
다만, 함수는 이름이 있는 클로저이다.
{ (매개변수 목록) -> 반환타입 in
실행코드
}
Parameter 와 ReturnType 이 있는 클로저
let closure = { (name: String) -> String in
return "Hello, \(name)"
}
name은 Argument Label이 아니고, 오직 Parameter Name.
클로저를 호출할 때는 함수와 다르게 Argument Label 을 사용하지 않는다.
closure("jihyun")
closure(name: "jihyun") //error!
또 다른 예시를 살펴보면 다음과 같다.
// 클로저의 사용
var sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a + b
}
sumResult = sum(1, 2) // 3
다음과 같이 변수에 함수를 할당할 수 있듯이
func sumFunction(a: Int, b: Int) -> Int {
return a + b
}
sumResult = sumFunction(a:b:)
클로저도 변수에 할당할 수 있다.
let add: (Int, Int) -> Int
add = {(a: Int, b: Int) => Int in
return a + b
} // add 에 클로저 할당
let substract: (Int, Int) -> Int
substract = {(a: Int, b: Int) -> Int in
return a - b
}
다음과 같이 method 에 클로저를 할당해보자.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
아까 정의해뒀던 add 를 할당해주었다.
var calculated: Int
calculated = calculate(a: 50, b: 10, method: add)
다음과 같이 클로저를 선언하면서 할당하는 것도 가능하다!!
calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
reutrn left * right
})
후행 클로저
클로저가 함수의 마지막 전달인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.
위에서 in 앞에 Int 는 생략할 수도 있다. (컴파일러가 이미 알고 있기 때문)
다만 in 은 생략할 수 없다.
result = calculate(a: 10, b: 20) { (left: Int, right: Int) in
return left + right
}
이렇게도 써줄 수 있다.
단축인자
클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 활용할 수 있다.
단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1,.. 로 표현한다.
result = calculate(a: 10, b: 10, method: {
return $0 + $1
}
당연히 단축인자도 후행 클로저로 쓸 수 있다.
result = calculate(a: 10, b: 10) {
return $0 + $1
}
result = calculate(a: 10, b: 10) {
$0 + $1
}
클로저가 반환하는 값이 있다면 마지막 줄의 결과물은 암시적으로 반환값으로 취급된다.
(return 생략가능)
위를
result = calculate(a: 10, b: 10) { $0 + $1 }
한 줄로 표현도 가능하다
'🦜 Swift' 카테고리의 다른 글
[Swift] 프로퍼티 감시자 (0) | 2022.11.20 |
---|---|
[Swift] 프로퍼티 (0) | 2022.11.20 |
[Swift] 열거형 (0) | 2022.11.19 |
[Swift] 클래스 (0) | 2022.11.19 |
[Swift] 구조체 (0) | 2022.11.19 |