클로저 반환
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 41번째.
makeCounter가 클로저를 반환하는 것을 보았습니다. 동일한 기법을 사용하여 설정 가능한(configurable) 동작을 만들 수 있습니다. 매개변수를 한 번 받고, 이를 여러 번 사용하는 함수를 다시 돌려받는 방식입니다.
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4)) // 12
print(tenfold(4)) // 40반환된 클로저는 k를 캡처하므로, 각각의 multiplier(...) 호출은 자신만의 k를 가진 완전히 새로운 클로저를 생성합니다.
이 패턴은 Swift에서 "전략(strategy)" 코드의 핵심입니다: 설정을 받아서 클로저를 반환하는 함수를 작성하고, 그 클로저를 map, filter, sorted(by:) 또는 함수 형태의 값이 필요한 곳 어디든 전달하는 것입니다.
챌린지
중급두 개의 클로저 팩토리를 작성하세요:
greaterThan(_ k: Int) -> (Int) -> Bool: 인수가k보다 엄격히 클 때true를 반환하는 서술어(predicate)를 반환합니다.scaleBy(_ k: Int) -> (Int) -> Int: 인수에k를 곱하는 함수를 반환합니다.
세 줄을 입력받습니다:
- 정수
threshold - 정수
scale - 쉼표로 구분된 정수 리스트
nums
세 줄을 출력합니다:
- 임계값(threshold)보다 큰 숫자들 (
greaterThan에서 생성된 클로저로 필터링),,로 연결하여 출력 - 동일한 숫자들을 스케일링한 결과 (
scaleBy로 매핑),,로 연결하여 출력 - 필터링을 통과한 숫자의 개수
입력이 5 / 3 / 2,7,3,8,9인 경우, 출력은 다음과 같습니다:
7,8,9
21,24,27
3치트 시트
클로저 팩토리(closure factory)는 매개변수를 캡처하고 그에 따라 구성된 새로운 클로저를 반환하는 함수입니다:
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
print(triple(4)) // 12각 호출은 k의 자체 캡처된 값을 가진 완전히 새로운 클로저를 생성합니다. 반환된 클로저는 map, filter, sorted(by:) 등에 직접 전달될 수 있습니다:
func greaterThan(_ k: Int) -> (Int) -> Bool {
return { n in n > k }
}
let nums = [2, 7, 3, 8, 9]
let filtered = nums.filter(greaterThan(5)) // [7, 8, 9]
let scaled = filtered.map(multiplier(3)) // [21, 24, 27]직접 해보기
let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: greaterThan, scaleBy; 필터링 후 매핑; 결합하여 출력 및 개수 세기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.