본문 바로가기
IOS - Swift

Swift 기초문법 - Closure

by 게게겍 2022. 9. 14.

📖 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()
}
 
함수를 parameter로 전달받는 doSomething이라는 함수가 있다고 가정할 때, 파라미터로 함수를 전달해도 되지만,
 
doSomething(closure: { () -> () in
    print("Hello!")
})

클로저를 전달받아 함수를 사용할 수 있습니다.

 

💬 함수의 반환 타입으로 클로저를 사용할 수 있습니다.

이전과 마찬가지로,  선언부는 기존 함수와 똑같지만

func doSomething() -> () -> () {
    
    return { () -> () in
        print("Hello Sodeul!")
    }
}

그러나 실제 값을 return할 때 함수가 아닌 클로저를직접받아 리턴할 수 있습니다.

또한 호출하는 곳에서 클로저를 받아서 

let closure = doSomething()
closure()

실행시킬 수 있게 됩니다.


https://babbab2.tistory.com/81

 

'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