클로저는 다음 2개를 말함
Named Closure
func someFunc {
print("Named Closure")
}
Named Closure는 그냥 함수라고 부름
Unnamed Closure
let someClosure = {
print("Unnamed Closure")
}
이름을 붙이지 않고 사용하는 함수 = 클로저
클로저는 Named Closure & Unnamed Closure 둘 다 의미하지만,
보통은 Unnamed Closure라고 지칭함
★ 클로저는 함수이기 때문에 1급 객체 함수의 특성 갖고 있음 ★
클로저 표현식
키워드 "in"을 기준으로
전은 Closure Head 라고 부르고,
후는 Closure Body 라고 부름
{
(Parameters) -> Return Type in
실행 구문
}
Parameter와 Return Type이 없는 클로저
클로저는 함수로써, 1급 객체 특성을 가짐
따라서 상수에 클로저 대입 가능
let someClosure = { () -> () in
print("some Closure")
}
위에 처럼 Return Type이 없는 경우, 생략 가능
(단, Return Type이 있어도 생략 가능 + Parameter도 생략 가능)
Parameter와 Return Type이 있는 클로저
let someClosure = { (title: String) -> String in
return "Great! \(title)"
}
★ 여기서 "title"은 Parameter Name 이고, Argument Label은 아님 ★
(클로저에서는 Argument Label은 사용하지 않음)
여기서 someClosure를 호출하려면?
someClosure("무한도전")
// 아래는 오류 발생
someClosure(title: "무한도전")
클로저는 1급 객체로서 사용 가능
클로저를 변수 또는 상수에 대입 가능
let someClosure = { () -> () in
print("some Closure")
}
기존의 클로저를 새로운 상수나 변수에 대입 가능
let anotherClosure = someClosure
함수의 Parameter Type으로 클로저 전달 가능
func someFunction(someClosure: () -> ()) {
someClosure()
}
someClosure라는 함수를 파라미터로 전달 받는 someFunction이라는 함수 있음
이 경우, 함수보단 클로저로 전달할 수 있음
someFunction(someClosure: { () -> () in
print("Hello")
}
여기서 클로저는 다음과 같음
{ () -> () in
print("Hello")
}
함수의 반환 타입으로 클로저 사용 가능
func someFunction() -> () -> () {
}
실제 값을 return 할 때 함수가 아닌 클로저를 리턴할 수 있음
func someFunction() -> () -> () {
return { () -> () in
print("Some Closure")
}
}
호출하는 방법은 다음과 같음
let someClosure = someFunction()
someClosure()
// Some Closure
클로저 실행
클로저를 실행하는 방법은 2가지임
클로저가 대입된 변수나 상수로 호출
let someClosure = { () -> () in
print("Great!!! Closure")
}
someClosure()
// Great!! Closure
클로저를 직접 실행하기
이 경우는 일회성으로 사용하는데
클로저를 ( ) 소괄호로 감싸고, 코드 마지막에( ) 소괄호를 붙임
({ () -> () in
print("Great!!! Closure")
})()
// Great!!! Closure