코드의 블럭이라고도 불리우는 클로저
일급 시민(first-citizen)이기에 변수, 상수 등으로 저장이 가능 하고 전달인자로 전달이 가능하다.
(다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체) - 위키피디아
함수는 이름이 있는 클로저. 클로저의 일종이라고 보면 된다.
{ (매개변수 목록) -> 반환타입 in
실행코드
}
이러면 코드의 블럭이 된다. 매개변수가 필요 없으면 매개변수 를 안넣어도 된다.
- 함수와 다르게 이름정의는 필요하지는 않지만, 매개변수 전달과 반환 값이 존재 할 수 있다는 점이 동일합니다.
- 함수는 이름이 있는 클로저입니다.
func sumFunction(a: Int, b: Int) -> Int {
return a + b
}
var sumReslut: Int = sumFunction(a: 1, b: 2)
print(sumReslut) // 3
// 클로저의 사용
var sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a + b
}
sumReslut = sum(1,2)
print(sumReslut)
// 함수는 클로저의 일종이므로
// sum 변수에는 당연히 함수도 할당할 수 있다.
sum = sumFunction(a:b:)
sumReslut = sum(1,2) // 이러면 sumFunction 이 호출이 된것이다.
함수를 사용하면 이런 형식으로 보여진다.
첫 function은 우리가 흔히 사용하는 스위프트 함수이다.
그리고 클로저는 아래에 구현을 해놨는데, sumResult에 클로저를 할당해놓고 출력을 하면 sumFunction을 호출하여 출력한 것이 아닌, 클로저 sum을 호출하여 출력한 모습을 볼수가 있다.
이게 헷갈릴수도 있는데, 다시한번 말하지만 함수는 이름이 있는 클로저이다.
이름 정의가 필요한것이 아닐 뿐 클로저는 함수와 동일한 기능을 하고 있다.
그리고 마지막 문단 코드를 보면 함수를 sum 변수에 할당하는게 보이는데, 방금 위에서 말했듯이 함수는 클로저의 일종이므로 할당이 가능하다.
함수의 전달인자로서의 클로저
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)
}
var calculated: Int
calculated = calculate(a: 50, b: 10, method: add) // calculate 에 숫자들을 넣고 메소드에 아까 만들어준 클로저를 넣어준다.
print(calculated)
calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
return left * right
}) // 이렇게 클로저를 여기서 바로 생성해서 넣어줘도 된다.
print(calculated)
차근차근 코드를 살펴보자.
제일 위에 나오는 add, divide,... 4개의 계산 상수들에 클로저를 할당해 주었다.
그리고 중간에 calculate 함수는 메소드라는 이름으로 클로저를 넘겨준다라는 표현의 문구가 적혀있다. 이게 무슨말이냐 하면
마지막 문단 코드를 보면 calculate() 함수를 보면 두 수를 입력받고 아까 만들어준 클로저들(상수들) 을 메소드라고 지정해놨던 곳에 넣어주면 그 클로저가 작동하게 되는것이다. 아니면 마지막 코드에 보면 직접 클로저를 짜서 올리는 것도 가능하다.
댓글