클로저
클로저는 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다. 함수도 클로저의 일종이다. 클로저는
{(매개변수들) -> 반환 타입 in
실행 코드
}
형식을 따르고 크게 세가지로 나뉜다.
var sum: (Int, Int) -> {(a: Int, b: Int) ->Int in
return a + b
}
함수나 메서드의 마지막 전달인자로 위치하는 클로저는 함수나 메서드의 소괄호를 닫은 후 작성해도 된다. 후행 클로저는 맨 마지막 전달인자로 전달되는 클로저에만 해당된다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int {
return a + b
}
var result
result = calculate(a: 10, b:10) {(left: Int, right: Int) -> Int in //소괄호 밖으로 클로저를 빼줌. 마지막 전달인자만 가능
return left + right
}
매서드의 전달인자로 전달하는 클로저는 메서드에서 요구하는 형태로 전달해야하기 떄문에 적합한 타입을 유추할 수 있다.
func calculate(a: Int, b: Int, method: (Int, Int) { // 반환타입 생략됨
return a + b
}
result = calculate(a: 10, b:10) {(left: Int, right: Int) in //후행 클로저와도 동시에 사용 가능
return left + right
}
앞서 예로 든 두 코드 left, right 두 매개변수는 아무 의미없다.
result = calculate(a: 10, b:10, method: {
return $0 + $1 //$0은 Int타입의 첫 번째 매개변수
})
result = calculate(a: 10, b:10) {
return $0 + $1 //후행 클로저도 같이 사용 가능
}
클로저가 반환 값을 갖고 내부의 실행문이 단 한줄이라면 return을 생략가능하다./
result = calculate(a: 10, b:10) {
$0 + $1 //return도 생략
}
결과적으로
result = calculate(a: 10, b:10) {(left: Int, right: Int) -> Int in
return left + right
}
vs
result = calculate(a: 10, b:10) { $0 + $1 }
이렇게 많이 생략할 수 있게된다.
함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출될 때 클로저가 함수를 탈출한다고 표현한다. 매개변수의 이름의 :escaping을 키워드를 사용하여 클로저 탈출을 허용하낟. 따로 명시하지 않는다면 비탈출 클로저이다. 함수로 전달된 클로저가 함수의 동작이 끝난 후 필요가 없을 떄 비탈출 클로저를 사용한다.
함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저이다. 자동 클로저는 전달인자를 갖지 않는다. 자동 클로저는 호출되었을 때 자신이 감싸고 있는 코드의 결과값을 반환한다.
클로저는 이해가 잘 안된다.. 다음에 다시 한번 보자