Wie sieht ein typischer Arbeitstag eines Swift-Entwicklers im Jahr 2025 aus
\n\nAls ich anfing, Swift zu lernen, dachte ich, iOS-Entwickler seien so etwas wie Zauberer, die von morgens bis abends perfekten Code bei einer Tasse Latte in einem stylischen Coworking-Space schreiben. Die Realität, wie Sie sich denken können, erwies sich als prosaisch, aber nicht weniger interessant.
\n\nIn diesem Artikel führe ich Sie durch einen typischen Arbeitstag eines Swift-Entwicklers – vom morgendlichen Kaffee bis zum abendlichen Push in den App Store. Sie sehen nicht nur den Zeitplan, sondern auch echte Codefragmente, mit denen wir täglich konfrontiert werden. Los geht's!
\n\n09:00 — Morgen: Daily Stand-up und Planung
\n\nDer Tag beginnt mit einem kurzen Stand-up in Zoom oder Slack. Wir sind ein Team aus 5 iOS-Entwicklern, zwei Backend-Entwicklern und einem Product Owner. Jeder spricht 1-2 Minuten: was gestern erledigt wurde, was heute geplant ist, ob es Blocker gibt.
\n\nMeine typische Antwort klingt so:
\n\n- \n
- Gestern: Refactoring des Autorisierungsmoduls mit Combine abgeschlossen. \n
- Heute: Integration des neuen Profilbildschirms mit SwiftUI, Übergangsanimation erforderlich. \n
- Blocker: Warte auf die finalen Mockups vom Designer für das dunkle Design. \n
Nach dem Stand-up – 15 Minuten zum Durchgehen der Nachrichten in Jira und GitHub. Ich schaue, welche PRs mein Review benötigen, und lese Kommentare zu meinen Pull-Requests.
\n\n09:45 — Erste tiefe Arbeit: Neue Funktionalität
\n\nDer Morgen ist die beste Zeit für komplexe Aufgaben. Heute schreibe ich das Modul für Push-Benachrichtigungen mit Deep Linking. So sieht eine typische Struktur der Handler-Klasse aus:
\n\nimport UIKit\nimport UserNotifications\n\nfinal class PushNotificationHandler: NSObject, UNUserNotificationCenterDelegate {\n \n func userNotificationCenter(\n _ center: UNUserNotificationCenter,\n didReceive response: UNNotificationResponse,\n withCompletionHandler completionHandler: @escaping () -> Void\n ) {\n let userInfo = response.notification.request.content.userInfo\n \n guard let deepLink = DeepLinkParser.parse(userInfo) else {\n completionHandler()\n return\n }\n \n Task { @MainActor in\n Coordinator.shared.handle(deepLink)\n }\n \n completionHandler()\n }\n \n func userNotificationCenter(\n _ center: UNUserNotificationCenter,\n willPresent notification: UNNotification,\n withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void\n ) {\n completionHandler([.banner, .sound, .badge])\n }\n}\n\nBeachten Sie Task { @MainActor in } – dies ist die moderne Methode, um die Ausführung auf dem Hauptthread zu erzwingen, ohne das altmodische DispatchQueue.main.async. Ein iOS-Entwickler nutzt heute aktiv Concurrency aus Swift 5.5+.
11:00 — Code Review: Ein Blick von außen
\n\nEine Benachrichtigung von einem Kollegen kommt: „Schau dir bitte den PR an.“ Ich öffne GitHub und sehe Änderungen im Datenmodell. Hier ist ein Beispiel für das, was ich oft kommentiere:
\n\n// ❌ Schlecht: force unwrap\nlet user = users.first!\n\n// ✅ Gut: sicheres Extrahieren\nguard let user = users.first else {\n assertionFailure("Die Liste users sollte zu diesem Zeitpunkt nicht leer sein")\n return\n}\n\nBeim Code Review diskutieren wir nicht nur die Korrektheit, sondern auch die Architektur. Heute hat ein Kollege SwiftUI mit @ObservableObject verwendet, aber gemäß unserem Codestil wechseln wir zu @Observable (iOS 17+). Ich mache eine sanfte Anmerkung:
// Wir empfehlen, auf @Observable umzuschreiben\n@Observable\nfinal class ProfileViewModel {\n var name: String = ""\n var age: Int = 0\n}\n\n12:30 — Mittagessen und Kontextwechsel
\n\nMittagessen ist heilig. Ich gehe nach draußen oder koche selbst. Ich versuche, nicht auf den Bildschirm zu schauen – die Augen ruhen sich aus. Beim Mittagessen lese ich oft Telegram-