Lektion 1.2 · Stufe 1 – Swift-Fundament

Konstanten, Variablen und Typen

ca. 15 Minuten Lesezeit

Lernziel

Nach dieser Lektion kannst du Werte in Konstanten (let) und Variablen (var) speichern, kennst die wichtigsten Typen (Int, Double, String, Bool) und weißt, warum Swift so genau auf Typen achtet.

Das Problem: Werte merken

Stell dir vor, du schreibst ein kleines Programm, das deinen Kontostand ausgibt, dann eine Ausgabe abzieht und wieder den Kontostand ausgibt:

Swift
print(1250)
print(1250 - 80)

Das funktioniert, hat aber zwei Schwächen. Erstens: Was bedeutet 1250? Ohne Erklärung weiß das niemand. Zweitens: Ändert sich der Kontostand, musst du die Zahl an jeder Stelle einzeln anpassen und darfst keine vergessen.

Was wir brauchen, ist eine Möglichkeit, sich einen Wert unter einem Namen zu merken.

Schachteln mit Namen

Stell dir eine beschriftete Schachtel vor. Auf dem Etikett steht ein Name, zum Beispiel kontostand. In der Schachtel liegt ein Wert, zum Beispiel 1250. Immer wenn du den Namen benutzt, holt Swift den Wert aus der Schachtel.

In Swift gibt es zwei Sorten von Schachteln:

  • let: eine Konstante. Einmal befüllt, bleibt der Inhalt für immer gleich.
  • var: eine Variable. Der Inhalt darf später ausgetauscht werden.
Swift
let geburtsjahr = 1990
var kontostand = 1250

print(kontostand)        // 1250
kontostand = kontostand - 80
print(kontostand)        // 1170

Lies kontostand = kontostand - 80 so: „Nimm den aktuellen Kontostand, zieh 80 ab und leg das Ergebnis wieder in die Schachtel kontostand.“ Das = bedeutet in Swift also nicht „ist gleich“ wie in Mathe, sondern „bekommt den Wert“.

let oder var?

Versuch einmal, eine Konstante zu ändern:

Swift
let geburtsjahr = 1990
geburtsjahr = 1991

Fehlermeldung

Cannot assign to value: 'geburtsjahr' is a 'let' constant

Xcode verhindert die Änderung, und das ist gewollt. Dein Geburtsjahr ändert sich nie. Wenn es sich im Code doch ändert, ist das ein Fehler, und Swift fängt ihn für dich ab.

Die Faustregel

Nimm immer zuerst let. Nur wenn sich der Wert wirklich ändern muss, wechselst du zu var. Xcode hilft dabei: Schreibst du var und änderst den Wert nie, zeigt es eine gelbe Warnung mit dem Vorschlag, let zu verwenden.

Warum dieser Aufwand? Weil Code mit vielen Konstanten leichter zu verstehen ist. Siehst du let, weißt du sofort: Dieser Wert bleibt so. Du musst nicht den ganzen Code durchsuchen, ob er irgendwo verändert wird.

Gute Namen

Namen in Swift folgen ein paar Regeln:

  • Sie beginnen mit einem Kleinbuchstaben.
  • Besteht ein Name aus mehreren Wörtern, beginnt jedes weitere Wort mit einem Großbuchstaben: kontostandAktuell, anzahlNutzer. Diese Schreibweise heißt camelCase, weil die Großbuchstaben wie Kamelhöcker herausragen.
  • Leerzeichen und Bindestriche sind nicht erlaubt.
  • Groß- und Kleinschreibung zählt: name und Name sind zwei verschiedene Dinge.

Deutsch oder Englisch?

In diesem Kurs verwenden wir ab jetzt englische Namen im Code, z. B. balance statt kontostand. So arbeiten Entwickler weltweit, und du gewöhnst dich gleich daran. Texte, die der Nutzer sieht, bleiben natürlich deutsch.

Ein guter Name beschreibt, was in der Schachtel steckt: userAge ist besser als a, x oder zahl1.

Typen: Was steckt in der Schachtel?

Jeder Wert in Swift hat einen Typ. Der Typ sagt, um welche Art von Wert es sich handelt. Die vier wichtigsten:

TypBedeutungBeispiele
IntGanze Zahl (Integer)42, -7, 0
DoubleKommazahl3.14, -0.5, 19.99
StringText"Hallo", "Anna", ""
BoolWahr oder falsch (Boolean)true, false

Achtung

Kommazahlen schreibt man in Swift mit Punkt, nicht mit Komma: 3.14, nicht 3,14.

Swift
let age = 34              // Int
let price = 19.99         // Double
let name = "Anna"         // String
let isLoggedIn = true     // Bool

Typableitung: Swift denkt mit

Im Beispiel oben hast du nirgends geschrieben, welcher Typ gemeint ist. Swift erkennt ihn selbst am Wert:

  • 34 sieht aus wie eine ganze Zahl → Int
  • 19.99 hat einen Punkt → Double
  • "Anna" steht in Anführungszeichen → String
  • true → Bool

Das nennt man Typableitung (englisch type inference). Du kannst den Typ aber auch ausdrücklich angeben, mit einem Doppelpunkt nach dem Namen:

Swift
let age: Int = 34
let price: Double = 19.99
let name: String = "Anna"
let isLoggedIn: Bool = true

Lies let age: Int = 34 als: „Eine Konstante age vom Typ Int mit dem Wert 34.“

Wann schreibt man den Typ dazu?

  • Meistens nicht, denn Swift erkennt ihn ja.
  • Wenn Swift sonst etwas anderes erraten würde: let temperature: Double = 20 macht aus der 20 eine Kommazahl.
  • Wenn du den Wert erst später festlegst:
Swift
let greeting: String
greeting = "Guten Morgen"

Swift ist streng, und das ist gut so

Eine Schachtel hat für immer denselben Typ. In eine Int-Schachtel passt kein Text:

Swift
var score = 10
score = "zehn"

Fehlermeldung

Cannot assign value of type 'String' to type 'Int'

Auch Int und Double lassen sich nicht einfach mischen:

Swift
let apples = 3
let pricePerApple = 0.5
let total = apples * pricePerApple

Fehlermeldung

Binary operator '*' cannot be applied to operands of type 'Int' and 'Double'

Du musst Swift ausdrücklich sagen, dass die ganze Zahl als Kommazahl behandelt werden soll:

Swift
let total = Double(apples) * pricePerApple   // 1.5

Double(apples) erzeugt aus der 3 die Kommazahl 3.0. Das nennt man Typumwandlung.

Das wirkt am Anfang pingelig. In anderen Sprachen „klappt es einfach“. Aber genau dort entstehen dann Fehler, die erst auffallen, wenn die App schon bei Nutzern läuft. Swift findet solche Fehler, bevor dein Programm überhaupt startet. Das ist einer der größten Vorteile der Sprache.

Typische Fehler

Konstante ändern

Fehlermeldung

Cannot assign to value: 'x' is a 'let' constant

Du willst einen Wert ändern, der mit let angelegt wurde. Wenn er sich wirklich ändern soll: var daraus machen.

Name doppelt vergeben

Swift
var score = 10
var score = 20

Fehlermeldung

Invalid redeclaration of 'score'

var und let legen eine neue Schachtel an. Willst du nur den Wert ändern, lass das var beim zweiten Mal weg: score = 20.

Variable benutzen, bevor sie existiert

Swift
print(total)
let total = 100

Fehlermeldung

Cannot find 'total' in scope

Code läuft von oben nach unten. In der ersten Zeile gibt es total noch nicht.

Warnung: Variable wird nie verändert

Achtung

Variable 'name' was never mutated; consider changing to 'let' constant

Keine Katastrophe, aber ein Hinweis: Mach aus var ein let.

FAQ

Anfänger

Was bedeutet das überhaupt?

Darf ich Umlaute in Namen verwenden? Technisch ja: let größe = 180 funktioniert. Üblich ist es aber nicht, und manche Tastaturen oder Werkzeuge kommen damit schlecht zurecht. Bleib bei englischen Namen ohne Sonderzeichen.

Was passiert, wenn ich let und var verwechsle? Nichts Schlimmes. Xcode meldet dir entweder einen Fehler (du änderst ein let) oder eine Warnung (ein var wird nie geändert). Folge dem Hinweis, und alles ist gut.

Wie groß kann ein Int werden? Auf aktuellen iPhones und Macs bis etwa 9,2 Trillionen (eine 9 mit 18 Stellen). Für fast alles reicht das locker.

Fortgeschritten

Warum verhält es sich so?

Gibt es neben Double noch andere Kommazahl-Typen? Ja, zum Beispiel Float (weniger genau) und CGFloat (wird in Grafik-Code verwendet). In SwiftUI begegnen dir meist Double und CGFloat, die sich aber automatisch ineinander umwandeln. Im Zweifel nimm Double.

Warum ergibt 0.1 + 0.2 nicht genau 0.3? Probier es aus: print(0.1 + 0.2) gibt 0.30000000000000004 aus. Computer speichern Kommazahlen im Binärsystem, und manche Dezimalzahlen lassen sich darin nicht exakt darstellen, ähnlich wie 1/3 im Dezimalsystem nicht exakt geht. Für Geldbeträge verwendet man deshalb den Typ Decimal oder rechnet in Cent als Int.

Was ist der Typ von let x = 5 / 2? Int, und der Wert ist 2, nicht 2.5. Teilt man zwei ganze Zahlen, ist das Ergebnis wieder eine ganze Zahl, die Nachkommastellen fallen weg. Mehr dazu in Lektion 1.3.

Profi

Was passiert unter der Haube?

Ist let auch schneller als var? Kaum messbar. Der eigentliche Vorteil liegt in der Lesbarkeit und in der Sicherheit. Bei nebenläufigem Code (Lektion 3.8) wird let aber wichtig: Werte, die sich nicht ändern können, lassen sich gefahrlos zwischen Threads teilen.

Was bedeutet „statisch typisiert“? Swift legt den Typ jeder Variable beim Kompilieren fest, nicht erst beim Ausführen. Der Compiler prüft so schon vorher alle Zuweisungen und Rechnungen. Sprachen wie Python oder JavaScript sind dagegen dynamisch typisiert: Dort fallen Typfehler erst beim Ausführen auf.

Übungen

Anfänger

Übung 1: Steckbrief

Lege Konstanten für deinen Namen, dein Alter, deine Körpergröße in Metern und die Frage an, ob du Haustiere hast. Gib alle vier mit print aus. Welche Typen erkennt Swift jeweils?

Fortgeschritten

Übung 2: Kontostand

Leg eine Variable balance mit dem Wert 500.0 an. Zieh nacheinander drei Einkäufe ab (12.5, 49.99 und 100) und gib nach jedem Einkauf den Kontostand aus.

Lösung Übung 2Erst selbst probieren!
Swift
var balance = 500.0

balance = balance - 12.5
print(balance)   // 487.5

balance = balance - 49.99
print(balance)   // 437.51

balance = balance - 100
print(balance)   // 337.51

Die 100 ohne Punkt funktioniert hier, weil Swift aus dem Zusammenhang erkennt, dass eine Kommazahl gemeint ist. Je nach Rechnung können auch Werte wie 437.51000000000005 auftauchen. Das ist der Rundungseffekt aus dem 🟡-FAQ.

Profi

Übung 3: Durchschnitt

Du hast drei Testergebnisse als Int: let a = 7, let b = 9, let c = 8. Berechne den Durchschnitt als Kommazahl. Erwartet ist 8.0. Mit let d = 10 als viertem Wert soll 8.5 herauskommen.

Lösung Übung 3Erst selbst probieren!
Swift
let a = 7
let b = 9
let c = 8
let d = 10

let sum = a + b + c + d
let average = Double(sum) / 4.0
print(average)   // 8.5

Wichtig ist Double(sum). Ohne Umwandlung würde 34 / 4 als ganzzahlige Division 8 ergeben.

Zusammenfassung

  • let legt eine Konstante an, var eine Variable. Nimm immer zuerst let.
  • = bedeutet „bekommt den Wert“.
  • Namen in camelCase, aussagekräftig, auf Englisch.
  • Die wichtigsten Typen: Int, Double, String, Bool.
  • Swift leitet den Typ ab, du kannst ihn aber mit : Typ angeben.
  • Ein Wert behält immer seinen Typ. Umwandeln geht mit z. B. Double(zahl).

Spickzettel

Swift
let name = "Anna"          // Konstante, Typ String
var score = 0              // Variable, Typ Int
score = 10                 // neuer Wert
let price: Double = 20     // Typ ausdrücklich angeben
let total = Double(3) * 0.5 // Typumwandlung
let isActive = true        // Bool

Lektion geschafft?

Markiere sie als erledigt, damit du deinen Fortschritt siehst.