“Closures are self-contained blocks of functionality that can be passed around and used in your code.” — apple
Closure는 Apple 공식 문서에서 나와있는 것처럼, 특정 기능이 self-contained blocks
으로 구성된 코드의 묶음이라고 보면 된다. 즉, 우리가 알고 있는 Function과 같은 의미이다. 정확히는 우리가 알고 있는 Function은 Named Closure
이고, 여기서 말하는 closure
는 Unnamed Closure
이다.!
{ (parameter:parameter type) -> return type in
statements
}
Unnamed Closure
의 의미처럼, func
를 사용하지 않는다. 그리고, parameter
와 return type
을 결정하는 Head와 statements를 포함하는 Body로 구성되어 있다. 이때, in
으로 Head와 Body를 구분한다.
let theClosure = {
print("JUST LOVE CLOSURE")
}
theClosure()
위의 예시처럼, Closure
는 1급 객체이므로, (1) 상수(let)나 변수(var)에 대입, (2) 함수의 파라미터 타입으로의 전달, (3) 함수의 반환 타입으로의 사용이 가능하다.
--> 1급 객체에 대한 자세한 설명
let theClosure : (String) -> (String) = { name in
let love = "love" + "closure"
return love
}
theClosure("LOVE CLOSURE")
Closure를 경량 문법으로 사용하는 것을 뜻한다.
함수의 마지막 파라미터가 클로저일 때,이를 파라미터 값 형식이 아닌 함수 뒤에 붙여 작성하는 문법
이때, Argument Label은 생략된다
// 정의
func doSomething(closure: () -> ()) {
closure()
}
// 호출
doSomething(closure: { () -> () in
print("Hello!")
})
Trailing Closure 적용 전은 위에 처럼 작성해야 했다. 나처럼 눈이 안 좋은 사람은 Syntax에러 나기 딱 좋은 상황일 것 같다.. 이렇게 Closure가 파라미터의 값 형식으로 함수 호출 구문 ()안에 작성되어 있는 것을 inline Clousre
라고 한다.
이것을 Trailing Closure 방식으로 바꾸게 되면.. 두 단계로 경량화 할 수 있다.
doSomething () { () -> () in
print("Hello!")
}
doSomething { () -> () in
print("Hello!")
}
// 더 헷갈리는 것 같기도(?)...
이것을,
func fetchData(success: () -> (), fail: () -> ()) {
//do something...
}
fetchData(success: { () -> () in
print("Success!")
}, fail: { () -> () in
print("Fail!")
})
요렇게~
fetchData(success: { () -> () in
print("Success!")
}) { () -> () in
print("Fail!")
}