Kurz: Swift wandelt Typen nie implizit um: Int und Double mischst du nicht ohne Double(x).
Teil des Kurses Swift
Grundtypen
| Typ | Beispiele |
|---|---|
Int, UInt, Int8 … Int64 | 42, -7 |
Double, Float | 3.14 |
Bool | true, false |
String, Character | "Text", "c" |
Array, Dictionary, Set | [1, 2], ["a": 1], Set([1, 2]) |
| Tupel | (1, "zwei") |
Swift wandelt Typen nie implizit um: Int und Double mischst du nicht ohne Double(x).
import Foundation // für pow, sqrt, round ...
let i = 42
let d = 3.5
print(Double(i) + d, Int(d), Int(3.99), Double(7) / 2, 7 / 2, 7 % 3, -7 % 3)
print(i.isMultiple(of: 2), abs(-5), max(3, 9), min(3, 9), pow(2.0, 10.0))
print(Int.max, Int8.max, UInt8.min)
let (rest, zahl) = (7 % 3, 2 << 3)
print(rest, zahl, 5 & 3, 5 | 3, 5 ^ 3, ~5)
print(10.0 / 3.0, (10.0 / 3.0 * 100).rounded() / 100, 2.5.rounded(), 3.5.rounded(), 3.7.rounded(.down))
print(String(42) + "!", Int("123") ?? 0, Int("abc") ?? -1, Double("2.5")!)
print(i.description, d.description, 1.0 == 1, "5" == String(5))Ausgabe:
45.5 3 3 3.5 3 1 -1
true 5 9 3 1024.0
9223372036854775807 127 0
1 16 1 7 6 -6
3.3333333333333335 3.33 3.0 4.0 3.0
42! 123 -1 2.5
42 3.5 true trueBei Überlauf bricht ein Swift-Programm ab (sicher); für Umlauf gibt es &+, &*, addingReportingOverflow.
Optionals: Wert oder nichts
Eine Variable vom Typ T? (Optional) enthält entweder einen Wert oder nil. Der Compiler zwingt dich, den Fall “kein Wert” zu behandeln.
var maybe: Int? = Int("42")
var keiner: Int? = Int("x")
print(maybe as Any, keiner as Any)
if let zahl = maybe { // sicheres Auspacken
print("Zahl:", zahl)
}
guard let wert = maybe else { fatalError() } // früh verlassen (in Funktionen)
print(wert + 1)
print(keiner ?? 0) // Standardwert
print(maybe!) // Zwangs-Auspacken: stürzt bei nil ab!
print(maybe?.description ?? "nil") // Optional Chaining
print(keiner?.description ?? "nil")
print(maybe.map { $0 * 2 } as Any, keiner.map { $0 * 2 } as Any)
let name: String? = "Mia"
if let n = name, n.count > 2, n.first == "M" { // mehrere Bedingungen
print("Name beginnt mit M:", n)
}
let ersteZahl: Int? = [Int]().first
print(ersteZahl == nil, [3, 4].first as Any)Ausgabe:
Optional(42) nil
Zahl: 42
43
0
42
42
nil
Optional(84) nil
Name beginnt mit M: Mia
true Optional(3)Merke: Vermeide
!. Besser:if let,guard let,??odermap.
Verzweigungen
let punkte = 78
if punkte >= 90 {
print("sehr gut")
} else if punkte >= 75 {
print("gut")
} else {
print("weiter üben")
}
print(punkte >= 50 ? "bestanden" : "durchgefallen")
let tag = 3
switch tag {
case 1: print("Montag")
case 2, 3, 4: print("Mitte der Woche")
case 5...7: print("Ende der Woche")
default: print("unbekannt")
}
let paar = (2, -2)
switch paar {
case (let a, let b) where a == -b: print("Gegenpaar \(a)")
case (0, _): print("x ist null")
default: print("anderes")
}
let wert: Any = 3.5
switch wert {
case let i as Int: print("Int", i)
case let d as Double: print("Double", d)
case is String: print("String")
default: print("?")
}Ausgabe:
gut
bestanden
Mitte der Woche
Gegenpaar 2
Double 3.5switch muss vollständig sein (alle Fälle abdecken, sonst default) und fällt nicht durch wie in C.
Schleifen
for i in 1...3 { print(i, terminator: " ") }
print()
for i in stride(from: 10, to: 0, by: -4) { print(i, terminator: " ") }
print()
for i in 0..<3 { print(i, terminator: " ") }
print()
for (index, farbe) in ["rot", "grün", "blau"].enumerated() { print("\(index):\(farbe)", terminator: " ") }
print()
for c in "Swift" { print(c, terminator: ".") }
print()
var n = 3
while n > 0 { print(n, terminator: " "); n -= 1 }
print()
repeat { n += 1 } while n < 3
print(n)
äußere: for a in 1...3 {
for b in 1...3 {
if b == 2 { continue äußere }
if a == 3 { break äußere }
print("\(a)\(b)", terminator: " ")
}
}
print()
for x in 1...10 where x % 3 == 0 { print(x, terminator: " ") }
print()Ausgabe:
1 2 3
10 6 2
0 1 2
0:rot 1:grün 2:blau
S.w.i.f.t.
3 2 1
3
11 21
3 6 9Merke
- Typen:
Int,Double,Bool,String; keine impliziten Umwandlungen - Optionals
T?:if let,guard let,??,?.,map;!vermeiden switchist vollständig, ohne Durchfallen, mit Mustern undwhere- Schleifen:
for in,stride,while,repeat, Labels - Bereiche
1...3(inklusive) und0..<3(exklusive)
Übungsaufgabe
Schreibe FizzBuzz für 1 bis 30 mit switch.
Quiz zur Selbstkontrolle
Was ist ein Optional?
- Ein Typ, der einen Wert oder nil enthält (richtig)
- Ein optionaler Parameter
- Ein Fehlertyp
- Eine Schleife
Wie packt man ein Optional sicher aus?
- if let oder guard let (richtig)
- Mit !!
- Mit &
- Mit try
Was ist 0..<3?
- 0, 1, 2 (richtig)
- 0, 1, 2, 3
- 1, 2, 3
- 0 und 3
Weiter im Kurs
Zurück: Einführung und erstes Programm
Weiter: Funktionen, Closures und Collections
Alle Kapitel: Swift im Überblick