Lektion 0.4 · Stufe 0 – Orientierung

Deine erste App in 15 Minuten

ca. 15 Minuten Lesezeit

Lernziel

Nach dieser Lektion hast du eine kleine, funktionierende App gebaut, eine Motivations-App, die dir auf Knopfdruck einen zufälligen Spruch zeigt. Du startest sie im Simulator und, wenn du willst, auf deinem eigenen iPhone.

Vorab: Du musst noch nicht alles verstehen

Diese Lektion ist anders als die folgenden. Wir bauen eine App, ohne jedes Detail zu erklären. Warum?

Weil du sehen sollst, wohin die Reise geht. Wenn du am Ende dieser Lektion eine eigene App auf dem Bildschirm hast, weißt du: Das ist machbar. Die Details lernst du ab Stufe 1 Schritt für Schritt, und bei jedem neuen Konzept wirst du denken: „Ach, das war das in meiner ersten App!“

Also: Tipp mit, staune, und lass dich nicht verunsichern, wenn manches noch wie Zauberei wirkt.

Schritt 1: Neues Projekt anlegen

Wie in Lektion 0.3:

  1. File → New → Project… (⇧ ⌘ N)
  2. iOS → App → Next
  3. Product Name: Motivation
  4. Interface: SwiftUI · Language: Swift · Testing System: None · Storage: None
  5. Next → Speicherort wählen → Create

Öffne ContentView.swift.

Schritt 2: Ein großer Spruch

Ersetze den gesamten Inhalt von ContentView.swift durch diesen Code:

Swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 30) {
            Image(systemName: "sparkles")
                .font(.system(size: 60))
                .foregroundStyle(.orange)

            Text("Jeder Profi war einmal Anfänger.")
                .font(.title)
                .fontWeight(.bold)
                .multilineTextAlignment(.center)
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

Erwartetes Ergebnis im Canvas

Ein orangefarbenes Funkel-Symbol, darunter in großer, fetter Schrift der Spruch, zentriert.

Screenshot folgt: Motivations-App mit Funkel-Symbol und Spruch

Was passiert hier, grob gesagt?

  • VStack stapelt Dinge untereinander, mit spacing: 30 Abstand.
  • Image(systemName: "sparkles") zeigt ein Symbol aus Apples Symbolbibliothek.
  • Text(...) zeigt einen Text.
  • Die Zeilen mit dem Punkt am Anfang, wie .font(.title), nennt man Modifier. Sie verändern das Aussehen: Schriftgröße, Farbe, Ausrichtung.

Probier ruhig ein bisschen herum: Ändere .orange in .purple oder .title in .largeTitle. Der Canvas zeigt dir sofort das Ergebnis.

Schritt 3: Mehrere Sprüche und ein Button

Eine App mit einem einzigen Spruch ist schnell langweilig. Wir wollen auf Knopfdruck einen neuen bekommen. Ersetze den Code erneut komplett:

Swift
import SwiftUI

struct ContentView: View {
    let quotes = [
        "Jeder Profi war einmal Anfänger.",
        "Fehler sind Beweise dafür, dass du es versuchst.",
        "Kleine Schritte sind auch Schritte.",
        "Heute ist ein guter Tag, um etwas Neues zu lernen.",
        "Du musst nicht perfekt sein, nur dranbleiben."
    ]

    @State private var currentQuote = "Tippe auf den Button!"

    var body: some View {
        VStack(spacing: 30) {
            Image(systemName: "sparkles")
                .font(.system(size: 60))
                .foregroundStyle(.orange)

            Text(currentQuote)
                .font(.title)
                .fontWeight(.bold)
                .multilineTextAlignment(.center)

            Button("Neuer Spruch") {
                currentQuote = quotes.randomElement() ?? ""
            }
            .buttonStyle(.borderedProminent)
            .tint(.orange)
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

Im Canvas kannst du direkt auf den Button tippen. Bei jedem Tipp erscheint ein zufälliger Spruch.

Erwartetes Ergebnis

Symbol, Text „Tippe auf den Button!“ und darunter ein orangefarbener Button „Neuer Spruch“. Ein Tipp zeigt einen zufälligen Spruch aus der Liste.

Was ist neu?

  • let quotes = [...] ist eine Liste (in Swift: Array) von Sprüchen. Lektion 1.6.
  • @State private var currentQuote ist der aktuelle Spruch. @State sorgt dafür, dass sich der Bildschirm aktualisiert, wenn er sich ändert. Lektion 2.9.
  • Button("Neuer Spruch") { ... } ist ein Button. Der Code in den geschweiften Klammern läuft beim Tippen. Lektion 2.11.
  • quotes.randomElement() holt ein zufälliges Element aus der Liste.
  • ?? "" ist eine Absicherung für den Fall, dass die Liste leer wäre. Klingt kryptisch? Das ist ein Optional, eines der wichtigsten Themen in Swift. Lektion 1.8.

Du siehst: In 30 Zeilen stecken schon fünf Konzepte, die du im Kurs lernen wirst. Deshalb beginnen wir in Stufe 1 bei den Grundlagen.

Schritt 4: Ein bisschen Schliff

Zwei kleine Extras machen die App deutlich schöner. Ergänze den Code an zwei Stellen:

a) Eine sanfte Animation beim Wechsel. Ändere den Inhalt des Buttons:

Swift
Button("Neuer Spruch") {
    withAnimation {
        currentQuote = quotes.randomElement() ?? ""
    }
}

b) Ein farbiger Hintergrund. Ergänze nach .padding() (dem letzten Modifier des VStack) zwei Zeilen:

Swift
        .padding()
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.orange.opacity(0.1))

.frame(...) lässt den Inhalt den ganzen Bildschirm ausfüllen, .background(...) färbt ihn zartorange.

Erwartetes Ergebnis

Der ganze Bildschirm ist zartorange, und neue Sprüche werden sanft eingeblendet statt einfach ausgetauscht.

Der komplette Code zum Vergleichen
Swift
import SwiftUI

struct ContentView: View {
    let quotes = [
        "Jeder Profi war einmal Anfänger.",
        "Fehler sind Beweise dafür, dass du es versuchst.",
        "Kleine Schritte sind auch Schritte.",
        "Heute ist ein guter Tag, um etwas Neues zu lernen.",
        "Du musst nicht perfekt sein, nur dranbleiben."
    ]

    @State private var currentQuote = "Tippe auf den Button!"

    var body: some View {
        VStack(spacing: 30) {
            Image(systemName: "sparkles")
                .font(.system(size: 60))
                .foregroundStyle(.orange)

            Text(currentQuote)
                .font(.title)
                .fontWeight(.bold)
                .multilineTextAlignment(.center)

            Button("Neuer Spruch") {
                withAnimation {
                    currentQuote = quotes.randomElement() ?? ""
                }
            }
            .buttonStyle(.borderedProminent)
            .tint(.orange)
        }
        .padding()
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.orange.opacity(0.1))
    }
}

#Preview {
    ContentView()
}

Schritt 5: Im Simulator starten

Wähle oben ein iPhone-Modell und drück ⌘ R. Deine App startet im Simulator.

Drück dort ⇧ ⌘ H, um zum Home-Bildschirm zu wechseln. Zwischen den anderen Apps liegt jetzt deine App „Motivation“. 🎉

Schritt 6 (optional): Auf deinem eigenen iPhone

Wenn du ein iPhone hast, kannst du die App kostenlos darauf installieren. Beim ersten Mal sind ein paar Schritte nötig. Danach geht es mit einem Klick.

  1. Apple-Account in Xcode hinterlegen (siehe Lektion 0.2, Schritt 5).
  2. Team auswählen: Klick im Navigator ganz oben auf das blaue Projektsymbol „Motivation“. Wähle im Bereich Signing & Capabilities bei Team dein „Personal Team“ aus.
  3. iPhone verbinden: per USB-Kabel. Bestätige auf dem iPhone die Frage „Diesem Computer vertrauen?“.
  4. Entwicklermodus aktivieren: Auf dem iPhone unter Einstellungen → Datenschutz & Sicherheit → Entwicklermodus. Das iPhone startet neu und fragt noch einmal nach Bestätigung. Die Option erscheint oft erst, nachdem du das iPhone mit Xcode verbunden hast.
  5. iPhone als Ziel wählen: In der Toolbar oben dein iPhone statt des Simulators auswählen.
  6. Starten mit ⌘ R.
  7. Beim ersten Mal vertrauen: Möglicherweise meldet das iPhone, dass der Entwickler nicht vertrauenswürdig ist. Geh dann auf dem iPhone zu Einstellungen → Allgemein → VPN & Geräteverwaltung, tipp auf deinen Account und vertrau ihm. Danach in Xcode erneut ⌘ R.

Gut zu wissen

Mit dem kostenlosen Account läuft die App nur eine begrenzte Zeit (derzeit etwa eine Woche) auf deinem iPhone. Danach startest du sie einfach noch einmal aus Xcode. Mit dem kostenpflichtigen Developer Program fällt diese Grenze weg.

Die genauen Menünamen können sich zwischen iOS-Versionen leicht ändern. Wenn du eine Option nicht findest, nutz die Suche oben in den iPhone-Einstellungen.

Typische Fehler

Der Button tut nichts

Prüfe, ob vor var currentQuote wirklich @State steht. Ohne @State meldet Xcode sogar einen Fehler:

Fehlermeldung

Cannot assign to property: 'self' is immutable

Cannot find 'quotes' in scope

Entweder ein Tippfehler (z. B. quote statt quotes), oder die Liste steht an der falschen Stelle. Sie muss innerhalb von struct ContentView: View { ... } stehen, aber außerhalb von body.

Expected ',' separator

In der Liste fehlt ein Komma zwischen zwei Sprüchen. Jeder Spruch außer dem letzten braucht ein Komma am Ende.

„Signing for 'Motivation' requires a development team“

Du willst die App auf einem echten iPhone starten, hast aber kein Team ausgewählt. Siehe Schritt 6, Punkt 2.

Alles sieht anders aus als hier

Vergleich deinen Code mit dem kompletten Code oben. Oft ist es eine falsch gesetzte Klammer. Markier den ganzen Code mit ⌘ A und drück ⌃ I. Xcode rückt dann alles korrekt ein, und falsch gesetzte Klammern fallen sofort auf.

FAQ

Anfänger

Was bedeutet das überhaupt?

Ich habe nur die Hälfte verstanden. Ist das schlimm? Überhaupt nicht, das ist der Plan. Diese Lektion zeigt dir das Ziel. Ab der nächsten Lektion lernst du jedes Teil einzeln kennen.

Kann ich eigene Sprüche einfügen? Unbedingt! Füg einfach weitere Zeilen in die Liste ein. Achte auf die Anführungszeichen und das Komma am Ende.

Wie ändere ich das App-Symbol auf dem Home-Bildschirm? Das geht über die Datei Assets → AppIcon. Dafür brauchst du eine Bilddatei. Wir behandeln das in einem der Projekte.

Fortgeschritten

Warum verhält es sich so?

Warum steht die Liste mit let und der Spruch mit var? let heißt: Dieser Wert ändert sich nie. var heißt: Er kann sich ändern. Die Sprüche bleiben gleich, der aktuelle Spruch wechselt. Mehr dazu in Lektion 1.2.

Manchmal kommt derselbe Spruch zweimal hintereinander. Warum? randomElement() wählt jedes Mal komplett zufällig, also auch den aktuellen Spruch. Wie man das verhindert, ist eine schöne Übung für später. Ein Tipp: filter.

Profi

Was passiert unter der Haube?

Warum ist quotes eine Eigenschaft der View und nicht @State? Weil sich die Liste nie ändert. Konstanten in einer View sind unproblematisch: Sie werden bei jeder Neuberechnung der View mit erzeugt, das ist bei fünf Strings vernachlässigbar. In einer größeren App würde man sie eher in eine eigene Datenquelle auslagern (Stufe 3).

Was macht withAnimation genau? Es markiert die Zustandsänderung als animiert. SwiftUI vergleicht das alte und das neue Aussehen und interpoliert dazwischen. Beim Text bedeutet das standardmäßig ein Überblenden. Wie man Animationen gezielt steuert, lernst du in den Lektionen 3.23 bis 3.26.

Übungen

Anfänger

Übung 1: Deine Sprüche

Ersetze die fünf Sprüche durch fünf eigene. Ändere die Farbe der App von Orange in deine Lieblingsfarbe (z. B. .blue, .green, .pink). Achte darauf, alle drei Stellen zu ändern.

Fortgeschritten

Übung 2: Anderes Thema

Mach aus der App einen „Was koche ich heute?“-Generator: eine Liste mit Gerichten, ein passendes Symbol (z. B. "fork.knife") und ein Button „Vorschlag“.

Profi

Übung 3: Zähler

Zeig unter dem Button an, wie viele Sprüche schon angezeigt wurden, z. B. „3 Sprüche gelesen“.

Tipp: Du brauchst einen zweiten @State-Wert, eine Zahl, die bei jedem Tipp um 1 wächst (+= 1).

Lösung Übung 3Erst selbst probieren!

Ergänze unter @State private var currentQuote ...:

Swift
@State private var count = 0

Ergänze im Button nach currentQuote = ...:

Swift
count += 1

Und unter dem Button (aber noch innerhalb des VStack):

Swift
Text("\(count) Sprüche gelesen")
    .foregroundStyle(.secondary)

"\(count)" setzt den Wert der Zahl in den Text ein. Das nennt man String-Interpolation. Lektion 1.3.

Zusammenfassung

  • Du hast eine echte App gebaut, mit Text, Symbol, Button, Zufall und Animation.
  • Du hast sie im Simulator gestartet, vielleicht sogar auf deinem iPhone.
  • Du hast schon Begriffe gesehen, die dich durch den ganzen Kurs begleiten: View, Modifier, @State, Array, Optional.
  • Du musst sie noch nicht verstehen. Genau das ist ab jetzt unsere Aufgabe.

Glückwunsch!

Du bist offiziell App-Entwickler. Ab der nächsten Lektion lernst du, was hinter all dem steckt, und zwar von Grund auf.

Lektion geschafft?

Markiere sie als erledigt, damit du deinen Fortschritt siehst.