EMZETT.
Login

Kurz: Swift wandelt Typen nie implizit um: Int und Double mischst du nicht ohne Double(x).

Teil des Kurses Swift

Kapitel 2 von 8 im Kurs Swift. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Grundtypen

TypBeispiele
Int, UInt, Int8 … Int6442, -7
Double, Float3.14
Booltrue, 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 true

Bei Ü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, ?? oder map.

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.5

switch 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 9

Merke

  • Typen: Int, Double, Bool, String; keine impliziten Umwandlungen
  • Optionals T?: if let, guard let, ??, ?., map; ! vermeiden
  • switch ist vollständig, ohne Durchfallen, mit Mustern und where
  • Schleifen: for in, stride, while, repeat, Labels
  • Bereiche 1...3 (inklusive) und 0..<3 (exklusive)

Übungsaufgabe

Schreibe FizzBuzz für 1 bis 30 mit switch.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Einführung und erstes Programm

Weiter: Funktionen, Closures und Collections

Alle Kapitel: Swift im Überblick