값 캡처
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨. 56개 중 40번째.
클로저는 생성될 때 스코프에 있던 변수를 기억합니다. 클로저 본문은 나중에 주변 함수가 반환된 후에도 해당 변수를 읽고 심지어 수정할 수 있습니다. 이를 캡처링이라고 합니다.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3각 makeCounter 호출은 완전히 새로운 count를 제공하므로, 두 카운터는 절대 상태를 공유하지 않습니다:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2캡처링은 클로저를 일반 함수보다 강력하게 만드는 요소입니다. 클로저는 상태를 함께 유지합니다. JavaScript, Python 및 다른 많은 언어에서도 동일한 기법을 볼 수 있습니다.
챌린지
중급작은 카운터 팩토리를 만드세요.
makeCounter(start: Int, step: Int) 함수를 정의하세요. 이 함수는 () -> Int 타입의 클로저를 반환합니다. 클로저를 호출할 때마다 다음 값이 반환됩니다. 첫 번째 호출에서는 start를 반환하고, 다음 호출에서는 start + step을 반환하며, 그다음 호출에서는 start + 2*step을 반환하는 식으로 계속됩니다.
입력에서 세 개의 정수 start, step, n을 읽으세요. start와 step을 사용해 카운터를 만든 다음, 카운터를 n번 호출하고 각 결과를 한 줄에 하나씩 출력하세요.
입력이 5 / 3 / 4일 때 출력은 다음과 같습니다.
5
8
11
14직접 해보기
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: 실행 중인 값을 캡처하는 makeCounter(start:step:) -> () -> Int
// 그런 다음 이를 n번 호출하고 각 결과를 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 및 흐름의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드