Menu
Coddy logo textTech

Przechwytywanie wartości

Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 40 z 56.

Domknięcie zapamiętuje zmienne, które były w zakresie widoczności w chwili jego utworzenia. Treść domknięcia może później je odczytywać, a nawet modyfikować, także po zakończeniu działania otaczającej je funkcji. Nazywa się to przechwytywaniem.

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let next = makeCounter()
print(next())                    // 1
print(next())                    // 2
print(next())                    // 3

Każde wywołanie makeCounter daje ci zupełnie nowe count, więc dwa liczniki nigdy nie współdzielą stanu:

let a = makeCounter()
let b = makeCounter()
print(a())                       // 1
print(b())                       // 1
print(a())                       // 2

Przechwytywanie sprawia, że domknięcia są potężniejsze niż zwykłe funkcje: przenoszą ze sobą stan. Zobaczysz tę samą sztuczkę w JavaScript, Pythonie i wielu innych językach.

challenge icon

Wyzwanie

Średni

Zbuduj prostą fabrykę liczników.

Zdefiniuj funkcję makeCounter(start: Int, step: Int), która zwraca domknięcie typu () -> Int. Każde wywołanie domknięcia zwraca kolejną wartość: pierwsze wywołanie zwraca start, następne zwraca start + step, kolejne start + 2*step i tak dalej.

Wczytaj trzy liczby całkowite: start, step i n. Utwórz licznik z użyciem start i step, następnie wywołaj go n razy i wypisz każdy wynik w osobnym wierszu.

Dla danych wejściowych 5 / 3 / 4 wynikiem jest:

5
8
11
14

Spróbuj swoich sił

let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!

// TODO: utwórz makeCounter(start:step:) -> () -> Int, która przechwytuje bieżącą wartość
// następnie wywołaj ją n razy i wypisz każdy wynik
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Edytor online Swift