Werte erfassen
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy. Lektion 40 von 56.
Eine Closure merkt sich die Variablen, die bei ihrer Erstellung im Gültigkeitsbereich waren. Der Rumpf der Closure kann sie später lesen und sogar ändern, selbst nachdem die umgebende Funktion zurückgegeben 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()) // 3Jeder Aufruf von makeCounter gibt dir ein brandneues count, daher teilen sich zwei Zähler niemals ihren Zustand:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2Das Erfassen macht Closures leistungsfähiger als einfache Funktionen: Sie führen ihren Zustand mit sich. Du wirst denselben Trick in JavaScript, Python und vielen anderen Sprachen sehen.
Aufgabe
MittelErstelle eine kleine Zählerfabrik.
Definiere eine Funktion makeCounter(start: Int, step: Int), die einen Abschluss vom Typ () -> Int zurückgibt. Jeder Aufruf des Abschlusses gibt den nächsten Wert zurück: Der erste Aufruf gibt start zurück, der nächste start + step, der nächste start + 2*step und so weiter.
Lies drei Ganzzahlen aus der Eingabe ein: start, step und n. Erstelle einen Zähler mit start und step, rufe ihn dann n-mal auf und gib jedes Ergebnis in einer eigenen Zeile aus.
Für die Eingabe 5 / 3 / 4 lautet die Ausgabe:
5
8
11
14Probier es selbst
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: makeCounter(start:step:) -> () -> Int, das den laufenden Wert erfasst
// dann rufe es n-mal auf und gib jedes Ergebnis aus
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimSuchen in StringsAufteilen und ZusammenfügenTeilstrings ersetzenRückblick – Benutzernamen prüfen4Mengen
Mengen erstellenVereinigung und SchnittmengeSubtraktion und symmetrische DifferenzTeilmenge und ObermengeWiederholung – Tag-Filter7Projekt – Gewohnheitstracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteBereichsmethodenBereiche in SwitchRückblick – Kalender-Raster5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerketten von Map, Filter und ReduceRückblick – WortstatistikÜbe selbstständig: Swift-Playground