6일차 - 21.06.13

수킴·2021년 6월 13일
0

100DaysOfSwift

목록 보기
7/37
post-thumbnail

학습키워드

  • closure

1. Creating basic closures

스위프트의 여러타입을 선언하는 것처럼 함수타입을 선언할 수 있습니다.

즉, 함수를 만들어 변수에 할당하고, 해당 변수를 사용하여 해당 함수를 호출하고, 해당 함수를 다른 함수에 매개 변수로 전달할 수도 있습니다.

→ 이러한 방식으로 사용되는 함수를 클로저라고 합니다.

let driving: () -> () = {
    print("I'm driving in my car")
}

driving()

클로저를 사용하는 이유가 뭘까?

일반적인 이유 중 하나는 기능을 저장한 후 필요할 때 사용하기 위해서입니다.

  • 예시)
    1. Running some code after a delay.
    2. Running some code after an animation has finished.
    3. Running some code when a download has finished.
    4. Running some code when a user has selected an option from your menu.

2. Accepting parameters in a closure

클로저에서는 매개변수를 받을 수 있지만 받는 방식이 다릅니다.

매개변수를 받기 위해서는 {} 괄호 안에 매개변수를 () 에 나열한 다음 in 키워드 뒤에 실행할 코드를 작성합니다.

let driving: (String, Int) -> () = { (name: String, number: Int) in
    print("My Car is \(name) - \(number)")
}

driving("Tico", 213)
  • 함수와 클로의 차이점 중 하나는 클로저를 실행할 때 매개 변수 레이블을 사용하지 않는다는 것입니다. 클로저 내부에서는 매개변수 레이블 사용

  • 클로저는 외부 매개변수 이름을 지정할 수 없습니다.

  • 클로저는 매개변수명을 지정해야합니다 자료형만 입력하면 에러 발생

  • 클로저는 매개변수 타입을 생략할 수 없습니다.

3. Returning values from a closure

클로저는 값을 반환할 수 있습니다. 클로저 내부의 in 키워드 바로 앞에 작성합니다.

let drivingWithReturn: (String) -> String = { (place: String) -> String in
    return "I'm going to \(place) in my car"
}

매개변수가 없는 경우에 반환하고 싶으면 어떻게 할까?

함수에서와 동일하게 작동합니다 () 빈 괄호를 사용합니다.

// MARK - 매개 변수를 받아들이지 않고 값을 반환

let closurePayment = { () -> Bool in
    print("Paying an anonymous person…")
    return true
}

func functionPayment() -> Bool {
    print("Paying an anonymous person…")
    return true
}

4. Closures as parameters

클로저는 타입처럼 사용할 수 있기 때문에 함수에 매개변수로 클로저를 전달할 수 있습니다.

클로저를 매개변수로 사용하면 비동기방식처리를 할 때 유용합니다. 끝났을 때 할 행동을 취할 수 있습니다. (네트워크 요청, 백그라운드 실행작업 등등)

let driving: () -> Void = {
    print("I'm driving in my car")
}

func travel(action: () -> ()) {
    print("I'm getting ready to go.")
    action()
    print("I arrived!")
}

travel(action: driving)

💡 Void는 아무것도 반환하지 않는다는 뜻

5. Trailing closure syntax

함수에 대한 마지막 매개변수가 클로저인 경우 스위프트는 trailing closure syntax 후행클로저 구문이라는 특수한 구문을 사용할 수 있습니다.

// MARK - 클로저가 매개변수 마지막인경우
func travel(name: String, action: () -> Void) {
    print("I'm getting ready to go.")
    action()
    print("I arrived!")
    print("My \(name)")
}

travel(name: "Taylor") {
    print("I'm driving in my car")
}

// MARK - 후행클로저 사용안 한 경우 
travel(name: "Taylor", action: {
    print("I'm driving in my car")
})

// MARK - 클로저가 매개변수 마지막이 아닌 경우

func travel(action: () -> Void, name: String) {
    print("I'm getting ready to go.")
    action()
    print("I arrived!")
    print("My \(name)")
}

travel(action: {
    print("I'm driving in my car")
}, name: "Taylor")
  • 후행클로저를 사용하면 매개변수 레이블을 제거할 수 있고 함수 호출을 종료하는 경우 }) 를 사용하지 않을 수 있습니다.

후행 클로저를 사용하는 경우 매개변수 외부이름을 지정할 수 있습니다.

func goCamping(then action: () -> Void) {
    print("We're going camping!")
    action()
}
goCamping {
    print("Sing songs")
    print("Put up tent")
    print("Attempt to sleep")
}

goCamping(then: {
    print("Sing songs")
    print("Put up tent")
    print("Attempt to sleep")
})
  • 후행클로저 사용하는 경우 외부이름 생략 가능할 수 있습니다.

링크

100 Days of Swift - Day 6 - Hacking with Swift

profile
iOS 공부 중 🧑🏻‍💻

0개의 댓글