[swift] 12. 매개변수로서의 Closure

몽이 누나·2022년 4월 23일
0

swift 기초 문법

목록 보기
12/17
post-thumbnail

😎 클로저는 중요한 개념이니까 다시 보자 몽이 누나


📖 Closure가 매개변수로 활용될 경우

📌 매개변수도 반환도 없는 Closure

💬 다음은 completion이라는 클로저를 매개변수로 가지는 메소드를 정의한 것입니다.

ex)

func sayHi(completion: () -> Void) {
    print("sayHi() called")
    sleep(2) // 2초 멈추기
    // completion이라는 클로저 실행
    completion()
}

>>> sayHi() called

💬 클로저는 축약이 용이합니다.
💬 정의한 메소드를 호출하는 방법 3가지를 알아봅시다.

  • 첫번째
sayHi(completion: {
    print("2초가 지났다. 1")
})

>>> sayHi() called
2초가 지났다. 1
  • 두번째
sayHi() {
    print("2초가 지났다. 2")
}

>>> sayHi() called
2초가 지났다. 2
  • 세번째
sayHi{
    print("2초가 지났다. 3")
}

>>> sayHi() called
2초가 지났다. 3

📌 데이터를 반환하는 Closure

ex)

func sayHiWithName(completion:(String) -> Void) {
    print("sayHiwithName() called")
    sleep(2)
    // 클로저를 실행과 동시에 데이터를 반환
    completion("행복한 몽이 누나")
}

💬 정의한 메소드를 호출하는 방법 4가지를 알아봅시다.

  • 첫번째
sayHiWithName(completion: { (comment: String) in
    print("2초 뒤에 그가 말했다. comment : ", comment)
})

>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment :  행복한 몽이 누나
  • 두번째
sayHiWithName(completion: {comment in
    print("2초 뒤에 그가 말했다. comment : ", comment)
})

>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment :  행복한 몽이 누나
  • 세번째
sayHiWithName{comment in
    print("2초 뒤에 그가 말했다. comment : ", comment)
}

>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment :  행복한 몽이 누나
  • 네번째

💡 달러 싸인 은 $0, $1 ...과 같이 표현하고, 들어오는 순서대로 숫자를 적으면 됩니다.

sayHiWithName{
    print("2초 뒤에 그가 말했다. comment : ", $0)
} 

>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment :  행복한 몽이 누나

📌 Closure와 Optional

ex)

func sayHiOptional(completion: (() -> Void)? = nil) {
    print("sayHi() called")
    sleep(2) // 2초 멈추기
    // completion이라는 클로저 실행
    completion?()
}

💬 호출해봅시다.

sayHiOptional(completion: {
    print("간식 먹는 몽이")
})

>>> sayHi() called
간식 먹는 몽이

📌 (Int) -> String Closure

💬 어떠한 형태를 받아서 다른 형태로 바꿀 때 많이 사용하는 모양으로, 콜렉션을 활용할 때 많이 사용합니다. (연산자 등)

ex)

💡 실행할 때 엔터를 두 번 치면 클로저로 변환되는 것을 확인할 수 있습니다.

var myNumbers : [Int] = [0, 1, 2, 3, 4, 5]

var transformedNumbers = myNumbers.map { aNumber in
    return "숫자: \(aNumber)"
}

💬 다른 표현 방법

var transformedNumbers2 = myNumbers.map { (aNumber: Int) -> String in
    return "숫자: \(aNumber)"
}
var transformedNumbers3 = myNumbers.map {
    return "숫자: \($0)"
}

📌 Closure를 사용하는 이유

함수를 선언했을 때의 결과값과 클로저의 결과값이 같은데, Closure를 사용하는 이유는
한 두번 사용하고 말 내용을 굳이 함수로 구현하여 메모리 낭비할 필요성 이 없기 때문입니다.
때문에 코드 블럭인 클로저를 사용합니다.


참고 자료

profile
몽이 누나의 코딩 일기

0개의 댓글