무명함수 Ramda식과 비슷한 개념이라고 이해해도 되나 조금 다름.
코드의 블럭을 의미하며, 함수는 이름이 있는 일종의 클로저이다.
변수, 상수 등으로 저장, 전달 인자로 전달이 가능하다.
func sumFunction(a: Int, b: Int)-> Int{
return a + b
}
var sumResult : Int = sumFunction(a: 1, b: 2)
var sum: (Int, Int) -> Int = {(a: Int, b: Int) -> Int in
return a + b
}
sumResult = sum(1,2)
print(sumResult)
//함수는 일종의 클로저이기 때문에, 클로저 변수에 함수도 할당할 수 있다.
sum = sumFunction(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
}
let divide: (Int, Int) -> Int
divide = {(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)
calculated = calculate(a: 50, b: 10, method: subtract)
calculated = calculate(a: 50, b: 10, method: divide)
클로저가 함수의 마지막 전달인자라면 마지막 매개 변수 이름을 생략한 후, 함수 소괄호 외부에 클로저를 구현할 수 있다.
result = calculate(a: 10, b: 10){
(left: Int, right: Int) -> Int in
return left + right
}
print(result)
어떤 타입을 반환할 것인지는 컴파일러도 알기 때문에 굳이 클로저에서 명시해 주지 않아도 된다. 하지만 in 키워드는 생략할 수 없다
result = calculate(a:10, b:10, method:{(left: Int, right: Int) in
return left + right
})
print(result)
//후행 클로저와 함께 사용할 수도 있다
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
}
//축약하지 않은 클로저 문법과 축약 후의 문법 비교
result = calculate(a: 10, b: 10, method: {(left: Int, right: Int) -> Int in
return left + right
})
result = calculate(a: 10, b: 10){$0 + $1}