Menu
Coddy logo textTech

값 캡처

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 및 다른 많은 언어에서도 동일한 기법을 볼 수 있습니다.

challenge icon

챌린지

중급

작은 카운터 팩토리를 만드세요.

makeCounter(start: Int, step: Int) 함수를 정의하세요. 이 함수는 () -> Int 타입의 클로저를 반환합니다. 클로저를 호출할 때마다 다음 값이 반환됩니다. 첫 번째 호출에서는 start를 반환하고, 다음 호출에서는 start + step을 반환하며, 그다음 호출에서는 start + 2*step을 반환하는 식으로 계속됩니다.

입력에서 세 개의 정수 start, step, n을 읽으세요. startstep을 사용해 카운터를 만든 다음, 카운터를 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번 호출하고 각 결과를 출력
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드