코드의 블럭
일급시민(first-citizen)
변수, 상수 등으로 저장, 전달인자로 전달이 가능
함수: 이름이 있는 클로저
매개변수 필요할 때
{(매개변수 목록) -> 반환타입 in
실행코드
}
매개변수 필요 없을 때
{() -> 반환타입 in
실행코드
}
반환하지 않을 때
{() -> Void in
실행코드
}
// 함수를 사용한다면
func sumFunction(a: Int, b: Int)->Int{
return a + b
}
var sumResult: Int = sumFunction(a:1, b:2)
print(sumResult) // 3
//클로저의 사용
var sum: (Int, Int) -> Int = {(a:Int, b:Int) -> Int in
return a + b
}
// 코드 해설: sum 은 두개의 Int를 받아서 Int를 반환하는 타입을 가진 함수이고, 그 함수는 첫번째 인자로 a, 두번째 인자로 b 를 받고, Int를 반환하하고, 실행코드는 두인자 a,b의 더한 내용을 반환한다.
sumResult = sum(1,2)
print(sumResult) // 3
// 함수는 클로저의 일종이므로
// sum 변수에는 당연히 함수도 할당할 수 있습니다.
sum = sumFuncton(a:b:)
sumResult = sum(1,2)
print(sumResult) // 3
클로저는 주로 함수의 전달인자로 많이 사용된다. 다른 용도에서도 많이 사용된다.
let add: (Int, Int) -> Int
add = {(a: Int, b: Int) -> Int in
return a + b
}
let substract: (Int, Int) -> Int
substract = {(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)
}
/*
위 함수는 3개의 인자를 전달 받는다
첫번째 인자는 Int,
두번째 인자는 Int
세번째 인자는 method
반환하는 값의 타입은 Int이고, 반환하는 값은 전달받은 함수를 실행한 결과이다.
*/
var calculated: Int
calculated = calculate(a:50, b:10, method:add)
// 전달받은 50과 10을 더하는 메서드 add 를 실행한 결과를 반환한다
print(calaclated) // 60
// 아래 코드도 비슷한 로직이다.
calculated = calculate(a:50, b:10, method:substract)
print(calaclated) // 40
calculated = calculate(a:50, b:10, method:divide)
print(calaclated) // 5
calculated = calculate(a:50, b:10, method:{(left:Int, right: Int)->Int
return left*Int
})
print(calaclated) // 500
출처 : 유튜브 "yagom"