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()) // 3Jeder 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()) // 2Capturing 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.
Aufgabe
MittelErstellen 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
14Spickzettel
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()) // 2Jeder 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
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 TrimmenSuchen in StringsTeilen und ZusammenfügenTeilstrings ersetzenWiederholung – Benutzernamen-Check4Mengen
Mengen erstellenVereinigung und SchnittmengeDifferenz und symmetrische DifferenzTeilmenge und ObermengeRückblick – Tag-Filter7Projekt - Habit Tracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteRange-MethodenRanges in SwitchRückblick – Kalender-Grid5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerkettung von map, filter, reduceRückblick – Wortstatistiken