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:
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.
let geburtsjahr = 1990
var kontostand = 1250
print(kontostand) // 1250
kontostand = kontostand - 80
print(kontostand) // 1170Lies 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:
let geburtsjahr = 1990
geburtsjahr = 1991Fehlermeldung
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:
nameundNamesind 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:
| Typ | Bedeutung | Beispiele |
|---|---|---|
Int | Ganze Zahl (Integer) | 42, -7, 0 |
Double | Kommazahl | 3.14, -0.5, 19.99 |
String | Text | "Hallo", "Anna", "" |
Bool | Wahr oder falsch (Boolean) | true, false |
Achtung
Kommazahlen schreibt man in Swift mit Punkt, nicht mit Komma: 3.14, nicht 3,14.
let age = 34 // Int
let price = 19.99 // Double
let name = "Anna" // String
let isLoggedIn = true // BoolTypableitung: Swift denkt mit
Im Beispiel oben hast du nirgends geschrieben, welcher Typ gemeint ist. Swift erkennt ihn selbst am Wert:
34sieht aus wie eine ganze Zahl →Int19.99hat einen Punkt →Double"Anna"steht in Anführungszeichen →Stringtrue→Bool
Das nennt man Typableitung (englisch type inference). Du kannst den Typ aber auch ausdrücklich angeben, mit einem Doppelpunkt nach dem Namen:
let age: Int = 34
let price: Double = 19.99
let name: String = "Anna"
let isLoggedIn: Bool = trueLies 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 = 20macht aus der20eine Kommazahl. - Wenn du den Wert erst später festlegst:
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:
var score = 10
score = "zehn"Fehlermeldung
Cannot assign value of type 'String' to type 'Int'
Auch Int und Double lassen sich nicht einfach mischen:
let apples = 3
let pricePerApple = 0.5
let total = apples * pricePerAppleFehlermeldung
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:
let total = Double(apples) * pricePerApple // 1.5Double(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
var score = 10
var score = 20Fehlermeldung
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
print(total)
let total = 100Fehlermeldung
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
Ü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?
Ü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!
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.51Die 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.
Ü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!
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.5Wichtig ist Double(sum). Ohne Umwandlung würde 34 / 4 als ganzzahlige Division 8 ergeben.
Zusammenfassung
letlegt eine Konstante an,vareine Variable. Nimm immer zuerstlet.=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
: Typangeben. - Ein Wert behält immer seinen Typ. Umwandeln geht mit z. B.
Double(zahl).
Spickzettel
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