클로저
스위프트에서 클로저란 보통 익명 함수를 뜻한다. 하지만 사실 func 키워드를 사용해 이름을 붙이는 함수들도 모두 클로저에 속한다.
클로저에는 Named Closure 와 Unnamed Closure 이 두가지로 나뉘는데 func 키워드를 사용해 만드는 함수를 named Closure 이라고 한다.
클로저 표현식
클로저 표현식은 아래와 같다.
{ (매개변수) -> 리턴 타입 in
실행구문
}
클로저는 말 그대로 익명'함수' 이기 때문에 매개변수와 리턴 타입이 존재할 수 있다.
매개변수와 리턴 타입이 모두 존재하지 않는 클로저
let closure = { () -> () in
print("Closure")
}
매개변수와 리턴 타입이 모두 존재하는 클로저
let closure = { (name: String) -> String in
return "Hello, \(name)"
}
여기서 주의할 점은 매개변수에 name 은 parameter Name 이지만, Argument Label 은 아니다. 따라서 클로저를 호출하려면 아래의 코드처럼 호출을 해야한다.
closure("홍길동")
closure(name: "홍길동") // <- Error
무조건 Argument Label을 사용하지 않는다. 만약 사용하면 오류가 발생한다.
1급 객체로서 클로저
클로저도 함수이므로 1급 객체 함수의 특성을 그대로 다 가지고 있다.
1. 클로저를 변수나 상수에 대입할 수 있다.
클로저 또한 변수나 상수에 대입할 수 있고, 이 대입된 변수나 상수로 실행이 가능하다.
let closure = { () -> () in
print("Closure")
}
위 코드와 같이 대입과 동시에 클로저를 작성할 수 있고, 다른 방법으로는 이미 만들어진 클로저를 변수나 상수에 대입할 수 있다는 점이다.
let closure2 = closure
2. 함수의 파라미터 타입으로 클로저를 전달할 수 있다.
func function1(closure: () -> ()) {
closure()
}
이 코드처럼 함수를 매개변수로 받는 함수가 있을 때 매개변수를 함수로 줄 수 있지만, 미리 만들어둔 클로저를 매개변수로 사용할 수 있고, 클로저를 직접 작성해서 넘겨줄 수도 있다.
function1(closure: { () -> () in
print("Hello")
})
3. 함수의 반환 타입으로 클로저를 사용할 수 있다.
func function2() -> () -> () {
}
이런 방식으로 함수의 반환 타입을 만들어 두고 함수를 반환할 수 도 있지만, 아래의 코드처럼 직접 return 값에 클로저를 작성해서 반환해줄 수 있다.
func function2() -> () -> () {
return { () -> () in
print("Hello")
}
}'TIL(Today I Learned)' 카테고리의 다른 글
| 2024.06.24 Today I Learned (1) | 2024.06.24 |
|---|---|
| 2024.06.19 Today I Learned (0) | 2024.06.19 |
| 2024.06.11 Today I Learned (1) | 2024.06.11 |
| 2024.06.10 Today I Learned (0) | 2024.06.10 |
| 2024.06.05 Today I Learned (0) | 2024.06.05 |