Menu
Coddy logo textTech

Werte erfassen

Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 40 von 56.

Eine Closure merkt sich die Variablen, die im Scope waren, als sie erstellt wurde. Der Body der Closure kann diese später lesen und sogar ändern, selbst nachdem die umgebende Funktion bereits beendet wurde. Dies wird als Capturing bezeichnet.

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

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

Jeder makeCounter-Aufruf liefert Ihnen einen brandneuen count, sodass zwei Zähler niemals ihren Zustand teilen:

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

Capturing ist das, was Closures mächtiger macht als einfache Funktionen: Sie führen einen Zustand mit sich. Den gleichen Trick werden Sie in JavaScript, Python und vielen anderen Sprachen sehen.

challenge icon

Aufgabe

Mittel

Erstellen Sie eine kleine Zähler-Fabrik.

Definieren Sie eine Funktion makeCounter(start: Int, step: Int), die eine Closure vom Typ () -> Int zurückgibt. Jeder Aufruf der Closure gibt den nächsten Wert zurück: der erste Aufruf gibt start zurück, der nächste start + step, der darauffolgende start + 2*step und so weiter.

Lesen Sie drei Ganzzahlen von der Eingabe ein: start, step und n. Erstellen Sie einen Zähler mit start und step, rufen Sie diesen dann n Mal auf und geben Sie jedes Ergebnis in einer eigenen Zeile aus.

Für die Eingabe 5 / 3 / 4 lautet die Ausgabe:

5
8
11
14

Spickzettel

Closures erfassen Variablen aus ihrem umgebenden Gültigkeitsbereich und behalten den Zustand bei, selbst nachdem die äußere Funktion beendet wurde:

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

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

Jeder Aufruf der Factory-Funktion erzeugt eine unabhängige erfasste Variable – zwei Zähler teilen niemals den Zustand.

Probier es selbst

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

// TODO: makeCounter(start:step:) -> () -> Int, die den laufenden Wert erfasst
// rufe sie dann n-mal auf und gib jedes Ergebnis aus
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss