매개변수를 받을 때, 클로저를 매개변수로 사용
함수에 전달하는 클로저는 자체 매개변수를 받을 수도 있습니다.
여태까지 우리는 ( ) -> 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
을 쓰는 것이 필요하다면, 이럴 때는 단축 매개변수를 사용하지 않는 것이 좋습니다.
중요한것은 단축매개변수는 코드를 읽고, 이해하는것이 정말 쉽다는 것입니다. 항상은 아니지만 때로는 짧고 간단하고 사례별로 구문을 선택 할 수도 있습니다.
인자 이름 축약 TEST : 문제를 풀려면 이곳을 클릭해주세요.
읽어주셔서 감사합니다🤟
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 기초문법 [String의 프로퍼티 및 메서드] (0) | 2021.02.27 |
---|---|
Swift : 기초문법 [구조체 - Struct] (0) | 2021.02.26 |
Swift : 기초문법 [#3 후행 클로저 - Closure syntax] (0) | 2021.02.24 |
Swift : 기초문법 [#2 클로저를 함수로 전달] (0) | 2021.02.24 |
Swift : 기초문법 [#1 클로저 기본 - Closure] (1) | 2021.02.24 |