클로저
- 코드 블럭
- 변수,상수 등으로 저장할 수 있고 전달인자로 전달이 가능하다.
// 형태
{ (매개변수) -> 반환타입 in
실행코드
}
// 클로저 사용
var sumClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a + b
}
sumResult = sum(1,2)
print(sumResult)
// 함수의 전달인자로서의 클로저
let add: (Int,Int) -> Int
add = { (a: Int, b: Int) -> Int in
return a + b
}
let subtract: (Int,Int) -> Int
subtract = { (a: Int, b: Int) -> Int in
return a - b
}
func calculate(a: Int, b: Int, method: (Int,Int) -> Int) -> Int {
return method(a,b) // 함수 안에서 전달받은 클로저를 호출해준다.
}
var calculated: Int
calculated = calculate(a: 50, b: 10, method: add)
print(calculated) // 60
calculated = calculate(a: 50, b: 20, method: substract)
print(calculated) // 30
// method의 전달인자로 클로저를 받아서 사용할 수도 있다.
calculated = calculate(a: 50, b: 10, method: { left: Int, right: Int) -> Int {
return left * right
}
print(calculated) // 500
후행클로저
// 형태
함수(매개변수) { 클로저 }
// 클로저가 함수의 마지막 전달인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
return left + right
}
print(result) // 20
// method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에 클로저에서 반환타입을 명시해주지 않아도 된다. in은 생략 불가
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
return left + right
})
// 후행클로저와 함께 사용할 수도 있다.
result = calculate(a: 10, b:10) { (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
}