클로저란?
클로저는 코드의 블럭을 말함
1급시민으로 전달인자, 변수, 상수 등으로 저장 및 전달이 가능함
★ 1급 시민이란?
1급 시민 또는 1급 객체라고도 함
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킴
보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 경우를 말함
func 키워드를 이용해 이름을 붙여주는 함수를 클로저라고 함
다만, 클로저에는 2가지가 있음
이번에 알아볼 것은 UnNamed Closure임
let sampleClosure = {
print("Hello Closure")
}
기본 클로저 문법
익명 함수이기 때문에 func 키워드는 사용하지 않음
in 이라는 키워드를 기준으로
(매개변수 목록) -> 반환타입 부분은 클로저 헤드라고 함
실행 코드 부분은 클로저 바디라고 함
{ (매개변수 목록) -> 반환타입 in
실행 코드
}
Parameter와 Return Type이 둘 다 없는 클로저
let SomeClosure = { () -> () in
print("SomeClosure")
}
Parameter와 Return Type이 둘 다 있는 클로저
여기서 Parameter로 name이 있음
이거는 Argument Label이 아님
(클로저에서는 Argument Label 사용하지 않음)
let SomeClosure = { (name: String) -> String in
return "Hello, \(name)"
}
따라서 호출할 때는 다음과 같이 함
SomeClosure("Mike")
Someclosure(name: "Mike") // 이거는 에러
앞서 클로저는 1급 객체 (= 1급 시민) 이라고 함
따라서 다음과 같이 사용 가능함
클로저를 변수나 상수에 대입 가능
let SomeClosure1 = { () -> () in
print("SomeClosure")
}
let SomeClosure2 = { (name: String) -> String in
return "Hello, \(name)"
}
let SomeClosure3 = SomeClosure1
함수의 파라미터 타입으로 클로저 전달 가능
함수를 파라미터로 전달받는 runSomething이라는 함수를 만듦
func runSomething(someClosure: () -> ()) {
someClosure()
}
아래와 같이 파라미터로 클로저를 받음
(someClosure: 뒤의 { 부터 } 까지가 클로저임 )
runSomething(someClosure: { () -> () in
print("Hello")
})
/*
아래와 같이도 작성 가능함
runSomething {
print("Hello")
}
*/
함수의 반환 타입으로 클로저 사용 가능
func doSomething() -> () -> () {
return { () -> () in
print("Hello!")
}
}
let closure = doSomething()
closure()
// Hello!
클로저 실행하는 방법
클로저가 대입된 변수나 상수 호출하기
let closure = { () -> String in
return "Hello!"
}
closure()
클로저를 직접 실행하기
({ () -> () in
print("Hello!")
})()
출처
https://babbab2.tistory.com/81