📖 Closure (클로저)
📌 Closure란
클로저 (Closure)는 코드블럭으로 C와 Objective-C의 블럭(blocks)과 다른 언어의 람다(lambdas)와 비슷한 성격을 지닙니다.
💬 클로저는 크게 두 가지 종류로 나눌 수가 있습니다.
- Named Closure
- Unnamed Closure
이름이 있는 보통의 함수(우리가 알고 있는 함수들)는 Named Closure 이고,
이름이 없는 함수들을 Unnamed Closure (익명 함수) 라고 합니다.
보통 클로저를 말할 때는 Unnamed된 함수를 의미합니다.
📌 NamedClosure vs UnNamed Closure 표현식
func coder() {
print("hooni")
}
이처럼 기존에 선언한 함수 를 이름이 있는 클로저라고 부름니다. 단지 이를 클로저라고 부르지 않고 함수라고 부르는것입니다
let closure = { print("coder") }
이처럼 익명으로 선언된 함수를 이름없는 함수라고 부르며 이를 클로져라고 부릅니다.
📌 Closure 표현식
{(Parameters) -> Return Type in 실행 구문}
💬 익명이기 때문에 func라는 키워드를 사용하지 않는 것이 특징입니다.
{(Parameters) -> Return Type // closure head
in // 구분짓는 기준
실행 구문 //closure body
}
📌 Parameter와 Return Type이 둘 다 없는 클로저
💬 클로저는 기본적으로 함수의 특성을 가지기 때문에, 상수에 직접 클로저를 대입할 수 있습니다.
let closure = { () -> () in
print("코더") }
📌 Parameter와 Return Type이 있는 클로저
💬클로저에선 Argument Label을 사용하지 않고 오직 Parameter Name만을 사용합니다.
let closure = { (name : String ) -> String in
return "hello + \(name)"
}
📌 String을 반환하는 Closure
let myName : String = {
// myName으로 들어간다
return "코더"
}()
print(myName)
>>> 코더
📌 Closure 정의 이해하기
let myRealName : (String) -> String = { (name:String) -> String in
return "개발하는 \(name)"
}
print(myRealName("후니"))
>>> 개발하는 후니
📌 Logic 처리
let myRealNameLogic : (String) -> Void = { (name : String) in
print("개발하는 \(name)")
}
myRealNameLogic("코더")
>>> 개발하는 코더
💬 반환값을 내어놓지 않고 로직을 담을 수도 있습니다.
💬 내어놓지 않을 경우 Void 로 표현합니다.
📌 Closure의 특징
💬 클로저를 변수나 상수에 대입할 수 있다
대입과 동시에 클로저를 작성할 수도 있고,
let closure = { () -> () in
print("코더") }
또는, 기존에 클로저를 대입한 변수나 상수를 새로운 변수나 상수에 대입할 수 있습니다.
let Closure2 = Closure
💬함수의 파라미터 타입으로 클로저를 전달할 수 있다.
func doSomething(closure: () -> ()) {
closure()
}
doSomething(closure: { () -> () in
print("Hello!")
})
클로저를 전달받아 함수를 사용할 수 있습니다.
💬 함수의 반환 타입으로 클로저를 사용할 수 있습니다.
이전과 마찬가지로, 선언부는 기존 함수와 똑같지만
func doSomething() -> () -> () {
return { () -> () in
print("Hello Sodeul!")
}
}
그러나 실제 값을 return할 때 함수가 아닌 클로저를직접받아 리턴할 수 있습니다.
또한 호출하는 곳에서 클로저를 받아서
let closure = doSomething()
closure()
실행시킬 수 있게 됩니다.
'IOS - Swift' 카테고리의 다른 글
Swift 기본문법 - Dictionary (0) | 2022.09.15 |
---|---|
Swift 기본문법 - 상속 (0) | 2022.09.15 |
Swift 기초문법 - Generic (0) | 2022.09.14 |
Swift 기초문법- struct와 class의 차이 (0) | 2022.09.14 |
swift 기초문법 - enum (0) | 2022.09.12 |