궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift : 기초문법 [#4 후행 클로저에 매개변수 사용 ]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

매개변수를 받을 때, 클로저를 매개변수로 사용

함수에 전달하는 클로저는 자체 매개변수를 받을 수도 있습니다.

 

여태까지 우리는 ( ) -> Void 를 "매개변수가 없고, 아무것도 반환하지 않는다"라는 의미로 사용해왔지만, 클로저에서 허용되는 모든 매개변수 유형으로 ( ) 에 채울 수 있습니다.

func travel(action: (String) -> Void) {
    print("나는 지금 집에 가고 있다..")
    action("서울")
    print("나는 도착했다!")
}

이제 후행 클로저 구문을 사용하여 travel() 을 호출할 때 문자열을 승인하기 위해 클로저 코드가 필요합니다.

travel { (place: String) in
    print("나는 지금 \(place)로 가고 있다.")
}

//나는 지금 집에 가고 있다..
//나는 지금 서울로 가고 있다.
//나는 도착했다!

예시

func getDirections(to destination: String, then travel: ([String]) -> Void) {
    let directions = [
        "앞으로 직진해서",
        "모퉁이에서 좌회전 하고,",
        "학교가 보이면 앞으로 쭉 가세요.",
        "그러면 당신은 \(destination)에 도착할꺼에요."
    ]
    travel(directions)
}
getDirections(to: "병원") { (directions: [String]) in
    print("제 차를 가져올께요")
    for direction in directions {
        print(direction)
    }
}
/*
제 차를 가져올께요
앞으로 직진해서
모퉁이에서 좌회전 하고,
학교가 보이면 앞으로 쭉 가세요.
그러면 당신은 병원에 도착할꺼에요.
*/
func fetchData(then parse: (String) -> Void) {
    let data = "Success!"
    parse(data)
}
fetchData { (data: String) in
    print("Data received: \(data)")
}
func fix(item: String, payBill: (Int) -> Void) {
    print("I've fixed your \(item)")
    payBill(450)
}
fix(item: "roof") { (bill: Int) in
    print("You want $\(bill) for that? Outrageous!")
}
//I've fixed your roof
//You want $450 for that? Outrageous!
func study(reviseNotes: (String) -> Void) {
    let notes = "열심히 빡코딩을 해야한다!"
    for _ in 1...10 {
        reviseNotes(notes)
    }
}
study { (notes: String) in
    print("내가 잊지 말아야 할 것: \(notes)")
}
//내가 잊지 말아야 할 것: 열심히 빡코딩을 해야한다!

매개 변수를 받을 때 클로저를 매개 변수로 사용 TEST: 문제를 풀려면 이곳을 클릭해주세요.

값을 반환 할 때 클로저를 매개변수로 사용

Swift의 클로저는 값을 반환할 뿐만 아니라 매개변수를 취할 수도 있으며, 이러한 클로저를 함수에 사용할 수도 있습니다. 더 좋은 것은 이 함수들은 또한 값을 반환할 수 있습니다.

 

여태까지 우리는 ( ) -> Void 를 "매개변수가 없고, 아무것도 반환하지 않는다"라는 의미로 사용해왔지만, 이Void를 모든 유형의 데이터로 대체하여 클로저가 값을 반환하도록 할 수 있습니다.

 

예시를 들어보겠습니다. 후행 클로저를 유일한 매개 변수로 받아들이고, 그 클로저를 차례로 받아들여 문자열을 반환하는 travel() 함수를 작성할 수 있습니다.

func travel(action: (String) -> String) {
    print("나는 나갈준비가 되었다.")
    let description = action("병원")
    print(description)
    print("나는 도착했다!")
}

이제 후행클로저 구문을 사용하여 travel() 을 호출할 때 문자열을 허용하고 문자열을 반환하려면 후행 클로저 코드가 필요합니다.

travel { (place: String) -> String in
 return "나는 \(place)에 차를타고 가고 있다."
}
/*
나는 나갈 준비가 되었다.
나는 병원에 차를타고 가고있다.
나는 도착했다!
*/

값을 반환할 때 클로저를 매개변수로 사용 TEST: 문제를 풀려면 이곳을 클릭해주세요

인자 이름 축약(단축 매개변수)

Swift는 인라인 클로저에 자동으로 축약 인자 이름을 제공합니다.

 

이 인자를 사용하면 인자 값을 순서대로 $0 , $1 , $2 등으로 사용할 수 있습니다. 축약 인자 이름을 사용하면 인자 값과 그 인자로 처리할 때 사용하는 인자가 같다는 것을 알기 때문에 인자를 입력받는 부분과 in 키워드 부분을 생략 할 수 있습니다.

 

위에서 travel() 이라는 함수를 만들었었죠? 하나의 매개 변수 String 을 허용했는데, 자체적으로 하나의 매개변수를 받아들이고 문자열을 반환하는 클로저이죠, 위의 클로저를 축약 매개변수를 사용하여 다시 한번 출력해볼게요.

 

첫 번째 방법,

travel { (place: String) -> String in
 return "나는 \(place)에 차를타고 가고 있다."
}

두 번째 방법,

Swift는 클로저에 매개변수가 문자열이어야 한다는 것을 알고 있기 때문에 매개변수제거할 수 있습니다.

travel { place -> String in
 return "나는 \(place)에 차를타고 가고 있다."
}

세 번째 방법,

또한 클로저가 문자열을 반환한다는 것을 알고 있기 때문에 반환값도 제거할 수 있습니다.

travel { place in
 return "나는 \(place)에 차를타고 가고 있다."
}

네 번째 방법,

클로저에는 값을 반환하는 코드 한 줄만 있죠? 그렇기 때문에 return값도 제거할 수 있습니다.

travel { place in
 "나는 \(place)에 차를타고 가고 있다."
}

다섯 번째 방법,

Swift에는 더 짧게 할 수 있는 속기 구문이 있습니다. place in 을 작성하는 대신 Swift가 클로저의 매개변수에 자동 이름을 제공하도록 할 수 있습니다. 이것들은 달러기호$로 명명된 다음 0부터 세는 숫자로 지정됩니다.

}
trvel {
    "나는 \($0)에 차를타고 가고있다."
}

이렇게 후행 클로저가 축약은 되었지만 논리를 표현하는데 결과값은 지장이 없습니다.

단축 매개변수는 언제 사용하나요??

클로저로 작업할 때 Swift는 클로저 작성을 고려하는 특수한 단축 매개변수 구문을 제공합니다. 이 구문에서는 매개 변수 이름을 $0, $1, $2 등으로 자동 번호를 지정합니다. 이러한 이름을 고유 코드로 사용할 수 없으므로, 이러한 이름이 바로 클로저에 대한 단축 구문임을 알 수 있습니다.

 

이 구문을 언제 사용해야 하는지는 상황에 따라 다릅니다.

  • 매개변수가 많이 있나요? 그렇다면, 단축 매개변수는 유용하지 않고 실제로 역효과를 주게됩니다. $0와 비교해야 하는 $3 또는 $4 보다는 실제 이름을 지정하면 의미가 명확해지겠죠?
  • 단축매개변수는 사실 일반적인 기능이 몇 개(약 10개) 있다는 사실을 깨닫게 될 것입니다. 따라서 코드를 읽는 많은 사람들은 $0 의 의미를 쉽게 이해할 수 있습니다.
  • 만약 제가 2-3번 이상 $0 을 쓰는 것이 필요하다면, 이럴 때는 단축 매개변수를 사용하지 않는 것이 좋습니다.

TIP
 
 

중요한것은 단축매개변수는 코드를 읽고, 이해하는것이 정말 쉽다는 것입니다. 항상은 아니지만 때로는 짧고 간단하고 사례별로 구문을 선택 할 수도 있습니다.

 

인자 이름 축약 TEST : 문제를 풀려면 이곳을 클릭해주세요.

 

 

읽어주셔서 감사합니다🤟


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.