RSS Use Your Loaf - iOS-Entwicklungsnachrichten und Tipps Folgen Useyourloaf.com/blog ist ein Back- und Lebensmittelblog von Michelle Roux, der eine Vielzahl von Rezepten, Backtipps und kulinarischen Abenteuern enthält. Use Your Loaf - iOS Development News & Tips useyourloaf.com RSS useyourloaf.com
Bildschirmgrößen des iPhone 17 Die kommende iPhone-17-Serie bietet ein gestrafftes Sortiment, eliminiert das Plus-Modell und führt das iPhone Air ein. Das Basis-iPhone 17 und die Pro-Modelle teilen sich das gleiche 6,3-Zoll-Display. Das Pro-Max-Modell behält sein 6,9-Zoll-Display und bietet damit unterschiedliche Größenoptionen. Das iPhone Air verfügt über ein 6,5-Zoll-Display und priorisiert ein schlankes Design. Sowohl das Basis-iPhone 17 als auch das iPhone 17 Pro werden den A19-Chip erhalten, wobei die Pro-Modelle eine Pro-Version erhalten. Das Basis-iPhone 17 enthält Funktionen wie ProMotion und Always-on-Display. Das dünne Design des iPhone Air kommt mit einer einzelnen 48-MP-Rückkamera. Die USB-3-Übertragungsgeschwindigkeiten bleiben auf die Pro-Modelle beschränkt. Das Dokument enthält Details zu Bildschirmauflösungen, Safe-Area-Einsetzen und anderen wichtigen Spezifikationen. Die Richtlinien für App-Store-Screenshots bleiben konsistent mit den Vorjahren. iPhone 17 Screen Sizes useyourloaf.com
Swift-Standardwert in String-Interpolationen Swift 6.2 verbessert die Zeichenfolgeninterpolation für optionale Werte und behebt frühere Einschränkungen. Vorherige Versionen erzeugten Warnungen beim Interpolieren von Optionals und schlugen die Verwendung eines Standardwerts oder String(describing:) vor. Die Verwendung eines Standardwerts erfordert oft einen willkürlichen, potenziell unsinnigen Ersatz. String(describing:) zeigt "nil" für Nullwerte an, was unerwünscht ist. Swift 6.2 führt einen Standardzeichenfolgenparameter innerhalb der Interpolation ein, wodurch dies behoben wird. Die neue Syntax ermöglicht die Angabe einer Standardzeichenfolge unabhängig vom Typ des Optionals, wodurch die Ausgabe verbessert wird. Zum Beispiel behandelt (count, default: "not set") Nullwerte elegant. Die Integration mit lokalisierten Zeichenfolgen wird jedoch nicht unterstützt. Das neue Feature ist in SE-0477 dokumentiert. Diese Verbesserung vereinfacht die Handhabung optionaler Werte in der Zeichenfolgeninterpolation. Die Einschränkung bei lokalisierten Zeichenfolgen erfordert weitere Untersuchungen. Swift Default Value in String Interpolations useyourloaf.com
Warnungen als Fehler behandeln in Swift Packages "Swift 6.2 führt eine feinere Kontrolle über Compiler-Warnungen in Swift-Paketen ein. Zuvor erlaubte Xcode, alle Warnungen als Fehler zu behandeln oder alle Warnungen über benutzerdefinierte Flags zu unterdrücken. Swift 6.1 führte jedoch Optionen ein, um spezifische Diagnosegruppen als Warnungen oder Fehler zu behandeln, wie z. B. "-Werror DeprecatedDeclaration". Entscheidend ist, dass diese granularen Kontrollen in Swift-Paketen bis Swift 6.2 nicht unterstützt wurden.Um diese neuen Funktionen nutzen zu können, müssen Entwickler ihre Swift-Tools-Version in der Datei Package.swift auf 6.2 aktualisieren. Swift 6.2 bietet neue swiftSettings wie treatAllWarnings(as:) und treatWarning("group", as:). Diese Einstellungen ermöglichen eine präzise Konfiguration, z. B. das Behandeln aller Warnungen als Fehler, mit Ausnahme einer bestimmten Gruppe wie "DeprecatedDeclaration". Es ist wichtig zu beachten, dass diese Einstellungen zur Warnungskontrolle nur angewendet werden, wenn ein Paket direkt erstellt wird, und ignoriert werden, wenn es als ferne Abhängigkeit verwendet wird. Entwickler können diese Kontrollen auf alle Ziele innerhalb eines Pakets anwenden, indem sie die Ziele durchlaufen und die gewünschten Einstellungen zu ihren swiftSettings hinzufügen. Diese Verbesserung bietet mehr Flexibilität bei der Verwaltung von Build-Zeit-Warnungen und -Fehlern." Treating Warnings As Errors In Swift Packages useyourloaf.com
Swift Roh-Identifikatoren Swift 6.2 führt Raw-Identifikatoren ein, die die Verwendung von Zeichen ermöglichen, die zuvor in Bezeichnernamen verboten waren. Diese Funktion, die über SE-0451 implementiert wurde, erlaubt es, Bezeichner in Backticks einzuschließen. Eine wichtige Anwendung findet sich in Swift Testing, wo Raw-Identifikatoren Redundanz bei der Benennung von Testfunktionen beseitigen können. Anstatt einen beschreibenden String für das @Test-Attribut und einen separaten, konventionellen Funktionsnamen zu schreiben, kann ein Raw-Identifikator beides sein. Dies macht Testfunktionsnamen beschreibend und sichtbar im Test-Navigator und in Berichten. Ein weiteres nützliches Szenario sind Enum-Cases, die natürlich Zahlen entsprechen. Zuvor waren Präfixe erforderlich, um zu vermeiden, dass Bezeichner mit Ziffern beginnen. Mit Raw-Identifikatoren können Enum-Cases wie 24 oder 30 direkt mit Backticks dargestellt werden. Dies vereinfacht den Code, indem künstliche Präfixe für numerische Enum-Cases vermieden werden. Obwohl die Verwendung von Backticks etwas umständlich erscheinen mag, bietet sie eine deutliche Verbesserung der Codeklarheit und Ausdrucksstärke. Swift Raw Identifiers useyourloaf.com
Swift-Beobachtungen von AsyncSequence für Zustandsänderungen Swift 6.2 führt einen neuen Typ namens Observations ein, um Zustandsänderungen von Observable-Typen zu streamen. Dies ist nützlich, um den Zustand von Anwendungen zu speichern, wie z. B. die Suchanfrage und den Navigationspfad einer Szene. Der Autor verwaltete diesen Zustand zuvor in einer Codable-Klasse namens SceneModel, die zur Speicherung in JSON kodiert werden konnte.Diese SceneModel wurde dann mithilfe von @SceneStorage in der Root-Ansicht gespeichert und wiederhergestellt. Das Speichern des Zustands beruhte jedoch auf der Überwachung der scenePhase, was unzuverlässig war, da Szenen beendet werden konnten, bevor sie in den Hintergrund wechselten. Vor Swift 6.2 ermöglichte ObservableObject mit @Published-Eigenschaften die Verwendung von Combine's buffer und values, um eine AsyncSequence zum Speichern von Zustandsänderungen zu erstellen.Mit iOS 26 und Swift 6.2 bietet der Observations-Typ eine ähnliche AsyncSequence für Observable-Typen. Dies ermöglicht die Beobachtung berechneter Eigenschaften, wie z. B. der JSON-Darstellung der SceneModel. Der Observations-Typ nimmt einen Closure entgegen, der den zu beobachtenden Wert zurückgibt.Änderungen sind transaktional, was bedeutet, dass mehrere synchrone Updates an beobachtbaren Eigenschaften zu einem einzigen Sequenzwert zusammengefasst werden. Die Nachverfolgung von Updates beginnt mit dem willSet von beobachtbaren Eigenschaften und endet am nächsten Aufhängepunkt. Dies ermöglicht das automatische Speichern des Zustands des Szenenmodells, wann immer es sich ändert, ohne auf die scenePhase angewiesen zu sein. Die AsyncSequence von Observations gibt den anfänglichen Wert der beobachteten Eigenschaft beim Abonnieren aus. Swift Observations AsyncSequence for State Changes useyourloaf.com
Zugängliche Nebenläufigkeit in Swift Packages Xcode 26 führt mit Swift 6.2 "Approachable Concurrency" ein, was Swift Concurrency vereinfacht. Dieser Ansatz priorisiert zunächst die Ausführung von Code auf dem Hauptthread und verlagert die Arbeit nur bei Bedarf in den Hintergrund. Um ihn zu übernehmen, müssen bestehende Projekte die Build-Einstellungen in Xcode anpassen. Neue Projekte aktivieren diese Funktion automatisch, einschließlich der standardmäßigen Actor-Isolation. Die Aktivierung von "Approachable Concurrency" schaltet zukünftige Funktionen wie InferIsolatedConformances und NonisolatedNonsendingByDefault frei. Swift Packages können diese Funktionen ebenfalls nutzen, indem sie die swift-tools-version aktualisieren und die Target-Einstellungen konfigurieren. Sie können die standardmäßige Actor-Isolation mit einer neuen swiftSettings-Option in Package.swift festlegen. Um alle Funktionen zu aktivieren, müssen Sie auch die "enableUpcomingFeature"-Flags zu den Swift-Einstellungen hinzufügen. Die Anwendung dieser Einstellungen auf alle Targets in einem Swift Package erfordert das Hinzufügen spezifischer Konfigurationen zur Package.swift-Datei. Eine frühe Einführung kann Compiler-Warnungen im Zusammenhang mit Protokollen wie CodingKey aufdecken. Diese Isolation-bezogenen Probleme werden voraussichtlich in Zukunft behoben, und Workarounds sind verfügbar. Approachable Concurrency in Swift Packages useyourloaf.com
Hinzufügen von Icon Composer-Icons zu Xcode Icon Composer ist ein neues Tool in Xcode 26, das dabei hilft, Icons für das Liquid-Glass-Design-System zu erstellen. Um Icon Composer zu verwenden, entwerfen Sie die Vordergrundschichten Ihres Icons in einem bevorzugten Design-Tool, exportieren Sie sie als vollständig deckende SVG-Schichten und importieren Sie sie in Icon Composer. In Icon Composer fügen Sie den Hintergrund hinzu, passen die Schichtgrößen und -positionen an, setzen die Opazität, Farbe, Gradienten, Schatten und Glas-Effekte. Xcode verwendet die einzelne .icon-Datei, um alle Icon-Varianten für unterstützte Plattformen zu generieren. Um Icons einem Xcode-Projekt hinzuzufügen, ziehen Sie die .icon-Datei in die Projekt-Navigator-Seitenleiste. Sobald hinzugefügt, können Sie die Icon-Datei direkt aus Xcode in Icon Composer öffnen und bearbeiten. Stellen Sie sicher, dass der App-Icon-Set-Name in den Ziel-Einstellungen mit dem Icon-Composer-Icon-Dateinamen ohne die .icon-Erweiterung übereinstimmt. Leider unterstützt Icon Composer keine alternativen App-Icons und Sie müssen Bild-Dateien manuell exportieren und dem Asset-Katalog hinzufügen. Dies reduziert die Nützlichkeit von Icon Composer für alternative App-Icons. Apple bietet Ressourcen, einschließlich der Human Interface Guidelines und WWDC-Videos, um mehr über Icon Composer und App-Icon-Design zu erfahren. Adding Icon Composer icons to Xcode useyourloaf.com
WWDC 2025-Anschauungsleitfaden Der WWDC 2025-Begleiter hilft Ihnen, die Sitzungen zu planen, die Sie ansehen möchten, mit zwei großen Themen: Liquid-Glas-Design und Apple-Intelligenz. Beginnen Sie mit dem Platforms State of the Union für eine Zusammenfassung dessen, was neu ist in diesem Jahr. Es gibt über 100 Sitzungen, also fühlen Sie sich nicht überwältigt - Sie haben Zeit zum Lernen. Sehen Sie sich die Sitzungen mit der Apple-Entwickler-App an, die Wiedergabe, Transkripte und Code-Kopieren unterstützt. Swift 6.2 ist hier, mit Aktualisierungen, um den Schmerz der Übernahme von Swift-Konkurrenz zu lindern, einschließlich eines einzigen Threads als Standard und der Möglichkeit, den Hauptdarsteller zu inferieren. Andere essentielle Sitzungen sind solche über SwiftUI, UIKit, iPadOS, AppKit, watchOS und Entwickler-Tools. Die Liquid-Glas-Design-Sitzungen sind ein Muss in diesem Jahr, zusammen mit Sitzungen über Testing, SwiftData, WidgetKit und Design. Die Design-Sitzungen behandeln Themen wie inklusives App-Design, SF-Symbole und interaktive Design-Snippets. Schließlich gibt es plattformspezifische Sitzungen, um Ihnen zu helfen, Ihr Design zu erhöhen. WWDC 2025 Viewing Guide useyourloaf.com
Synchronisieren von TipKit mit CloudKit Apple führte TipKit in iOS 17 ein, um Nutzern kontextbezogene Tipps anzuzeigen und verfolgt dabei die Häufigkeit der Tipps und Steuerungsereignisse. In iOS 18 können Sie den TipKit-Zustand mithilfe von CloudKit synchronisieren, um zu vermeiden, dass auf jedem Gerät dieselben Tipps angezeigt werden. Um die CloudKit-Synchronisierung zu aktivieren, wählen Sie Ihr App-Ziel in Xcode aus, fügen Sie die iCloud-Funktion hinzu und wählen Sie CloudKit. Fügen Sie dann eine Container-ID hinzu, die auf „.tips“ endet, und aktivieren Sie die Funktion „Hintergrundmodi“ mit „Remote-Benachrichtigungen“. TipKit synchronisiert standardmäßig nicht mit CloudKit, daher müssen Sie den CloudKit-Container bei der Konfiguration des Tipps-Datenspeichers aktivieren. Sie können die Option „.automatic“ verwenden oder eine spezifische ID übergeben, um den CloudKit-Container zu konfigurieren. Seien Sie vorsichtig, wenn Sie eine Core Data/SwiftData-Datenbank mit CloudKit synchronisieren, da möglicherweise die falsche Container-ID verwendet wird. Apple empfiehlt, einen separaten Container für die Synchronisierung von Tipps zu verwenden. Sie können Ihre Core Data/SwiftData-ID zuerst in der Entitlements-Datei auflisten oder sie explizit festlegen, bevor Sie den persistenten Speicher laden. Die Synchronisierung von TipKit mit CloudKit wurde auf der WWDC24 vorgestellt. Zusätzlich ist ein Buch über Modern Auto Layout während des WWDC25-Verkaufs zu einem reduzierten Preis erhältlich. Syncing TipKit with CloudKit useyourloaf.com
SwiftUI Picker mit optionaler Auswahl "Ein SwiftUI-Picker erwartet eine Bindung an eine Auswahl, wie z.B. eine Projekt-ID. Die ForEach-Schleife in einem Picker wendet automatisch ein Tag auf jedes Element an, wobei die Projekt-ID verwendet wird. Wenn ein Picker-Element ausgewählt wird, wird die Bindung des Pickers auf die ID des ausgewählten Elements gesetzt. Manchmal muss ein Picker mit einer optionalen Bindung arbeiten, die keine Auswahl zulässt. Um dies zu erreichen, muss jedes Picker-Element manuell mit einem optionalen Bezeichner getaggt werden. Der Tag-Modifikator hat einen Parameter, um anzugeben, dass das Tag optional ist, was standardmäßig auf true gesetzt ist. Um eine "Keine"-Option hinzuzufügen, kann eine Text-Ansicht mit einem Nil-Wert, der als optionale Projekt-ID gecastet wurde, zum Picker hinzugefügt werden. Der vollständige Projekt-Picker mit optionaler Auswahl enthält eine "Keine"-Option und eine manuelle Kennzeichnung jedes Elements mit seiner Projekt-ID. Die Auswahlbindung wird als optionale Projekt-ID deklariert. Der Body des Pickers enthält eine Beschriftung und eine Picker-Auswahl mit der Option "Keine" und der ForEach-Schleife mit manueller Kennzeichnung." SwiftUI Picker With Optional Selection useyourloaf.com
SwiftData-Predikate für Eltern-Beziehungen Dieser Text behandelt die Verwendung von SwiftData-Prädikaten, um Parent-Child-Beziehungen abzufragen. Er stellt ein Project-Modell mit einem topics-Array und ein Topic-Modell mit einer optionalen project-Eigenschaft vor. Um Themen innerhalb eines bestimmten Projekts abzufragen, überprüft ein Prädikat, ob topic.project?.persistentModelID mit der ID des Projekts übereinstimmt. Wenn man Themen über mehrere Projekte hinweg abfragen möchte, funktioniert die direkte Verwendung von projects.contains auf der optionalen topic.project?.persistentModelID nicht. Die vorgeschlagene Lösung beinhaltet die Verwendung von flatMap, um das Optional sicher zu entpacken und dann auf Enthaltensein zu prüfen. Alternativ kann eine If-Let-Anweisung das gleiche Ergebnis erzielen, wird aber als weniger prägnant angesehen. Der Text warnt auch davor, dass #Predicate-Makros nicht direkt auf Eigenschaften über Keypaths mit mehreren Komponenten zugreifen können. Eine Umgehung besteht darin, den Wert des Keypaths einer temporären Variable zuzuweisen, bevor er im Prädikat verwendet wird. Diese Techniken sind entscheidend für die effiziente Abfrage verwandter Daten innerhalb von SwiftData mithilfe von Prädikaten. SwiftData Predicates For Parent Relationships useyourloaf.com
SwiftUI-Ansichtsmodifikatoren für Label und Button-Stil Der Artikel behandelt das Erstellen benutzerdefinierter SwiftUI Button- und Label-Stile, darunter ein adaptiver Label-Stil, der bei kompakten horizontalen Größenklassen auf ein vertikales Layout umschaltet, und ein benutzerdefinierter Kapsel-Button-Stil mit einer gefüllten gelben Kapsel und einer Schriftart mit fester Breite. Diese Stile können Ansichten mit den Modifikatoren .labelStyle und .buttonStyle angewendet werden. Es ist jedoch weniger üblich, Convenience-Erweiterungen für LabelStyle oder ButtonStyle zu erstellen, die eine kompaktere Form des Modifikators ermöglichen würden. Um dies zu erreichen, schlägt der Artikel vor, ButtonStyle und LabelStyle zu erweitern, ähnlich wie Apple integrierte Stile definiert. Dies beinhaltet das Hinzufügen einer statischen Eigenschaft oder Funktion zur Erweiterung, die eine Instanz des benutzerdefinierten Stils zurückgibt. Beispielsweise kann der Kapsel-Button-Stil mit einer statischen Eigenschaft capsule erweitert werden, die eine CapsuleButtonStyle-Instanz zurückgibt. Dies ermöglicht die Anwendung des Stils mit der kompakten Form .buttonStyle(.capsule). Wenn der benutzerdefinierte Stil Parameter hat, z. B. eine konfigurierbare Farbe, kann die Erweiterung so modifiziert werden, dass sie eine Funktion enthält, die den Parameter entgegennimmt und eine Instanz des benutzerdefinierten Stils zurückgibt. Dies ermöglicht die Anwendung des Stils mit dem Parameter, z. B. .buttonStyle(.capsule(.orange)). Der Artikel enthält Beispiele dafür, wie ButtonStyle und LabelStyle erweitert werden können, um komfortable benutzerdefinierte Stile zu erstellen. SwiftUI Label and Button Style View Modifiers useyourloaf.com
SwiftUI-Tastenkürzel-Bereich Der .keyboardShortcut-Modifizierer in SwiftUI, eingeführt in iOS 14, ermöglicht die Zuweisung von Tastaturkürzeln zu Steuerelementen. Diese Kürzel lösen die primäre Aktion des Steuerelements aus. Der Modifizierer kann Modifizierer-Tasten über die standardmäßige Befehlstaste hinaus anpassen. Ein wichtiges Beispiel zeigt die Navigation zwischen Ansichten mit auf Schaltflächen angewendeten Kürzeln. Überraschenderweise bleiben die Kürzel auch dann aktiv, wenn das zugehörige Steuerelement nicht sichtbar ist. Dieses Verhalten resultiert aus der tiefenrekursiven Traversierung der Ansichtshierarchie durch SwiftUI, um Ziele für Tastaturkürzel zu finden. Das System priorisiert die Suche nach dem ersten passenden Steuerelement, unabhängig von seiner Sichtbarkeit. Dies kann zu unerwartetem Verhalten führen, bei dem nicht sichtbare Steuerelemente weiterhin auf Tastaturkürzel reagieren. Eine Lösung besteht darin, Steuerelemente mithilfe des .disabled-Modifizierers basierend auf dem Ansichtszustand zu deaktivieren. So wird sichergestellt, dass Tastaturkürzel nur aktiv sind, wenn die relevanten Steuerelemente sichtbar sind. Ein Kommentar von Curt Clifton liefert zusätzliche Informationen. SwiftUI Keyboard Shortcut Scope useyourloaf.com
SwiftUI Zugänglichkeitssprache "Beim Erstellen einer Sprachlern-App mit SwiftUI kann es vorkommen, dass VoiceOver Text nicht korrekt ausspricht, wenn er sich in einer anderen Sprache als der Gerätestandort befindet. Um dies zu beheben, müssen Sie die von VoiceOver verwendete Sprache für die Barrierefreiheit ändern. In UIKit können Sie die Eigenschaft accessibilityLanguage für Text-Labels festlegen, aber dies ist in SwiftUI nicht verfügbar. Eine vorgeschlagene Lösung besteht darin, AttributedString mit dem Attribut accessibilitySpeechLanguage zu verwenden, aber das funktioniert nicht. Eine andere Lösung besteht darin, die Umgebung für das Gebietsschema für jede Ansicht mithilfe des environment-Modifikators zu ändern. Dies funktioniert jedoch nur, wenn Sie den verbatim-Initialisierer für die Text-Ansicht verwenden, da der Text standardmäßig als lokalisierter Zeichenketten-Schlüssel behandelt wird. Diese Lösung funktioniert für Text-Ansichten, erfordert aber eine längere Form für Ansichten wie Label. Sie können das Gebietsschema auf das Label oder die Kind-Textansicht anwenden, aber wenn Sie ein Label mit einem Symbol verwenden, wird das Gebietsschema nur dann wirksam, wenn es auf den Button angewendet wird. Das bedeutet, dass VoiceOver "Button" im geänderten Gebietsschema ausspricht, der Haupttext aber korrekt ausgesprochen wird. Insgesamt ist die Änderung der Umgebung für das Gebietsschema für jede Ansicht die Lösung, um die von VoiceOver in SwiftUI verwendete Sprache für die Barrierefreiheit zu ändern." SwiftUI Accessibility Language useyourloaf.com
Standard-Anker für SwiftUI-Scrollen Der Artikel behandelt, wie man die vertikale Ausrichtung von Inhalten innerhalb einer ScrollView in SwiftUI verwaltet, insbesondere bei der Anpassung an dynamische Schriftgrößen. Anfangs wird eine einfache ScrollView verwendet, um Inhalte aufzunehmen, die die Bildschirmhöhe überschreiten könnten. Dies führt jedoch dazu, dass sich der Inhalt oben ausrichtet, wenn er kleiner als die ScrollView ist, was unerwünscht ist. iOS 17 führte den Modifier defaultScrollAnchor ein, der aber die nötige Feinheit vermissen lässt, um Inhalte nur dann zu zentrieren, wenn sie in die ScrollView passen. iOS 18 behebt dies mit einem neuen defaultScrollAnchor Modifier, der einen role-Parameter enthält. Dieser Parameter ermöglicht es Entwicklern, den Ankerpunkt für verschiedene Situationen anzupassen, einschließlich der Ausrichtung von Inhalten, die kleiner als der Container sind, mit Hilfe von .alignment. Indem man den Anker für die .alignment-Rolle auf .center setzt, wird der Inhalt zentriert, wenn er passt, und oben ausgerichtet, wenn er die Höhe des Containers überschreitet. Die beiden Varianten des View-Modifiers können zusammen verwendet werden, um den Standard zu ändern und den Anker für bestimmte Rollen zu überschreiben. Der neue Modifier bietet einen differenzierteren Ansatz zur Verwaltung der Inhaltsausrichtung in ScrollViews, basierend auf seiner Größe im Verhältnis zum Container. Dies gewährleistet eine bessere Benutzererfahrung, indem die vertikale Position des Inhalts dynamisch angepasst wird. SwiftUI Default Scroll Anchor useyourloaf.com
Swift Testing Completion Handler Der Autor migriert XCTest-Fälle zu Swift-Testing, aber stieß auf ein Problem beim Testen von Code, der auf Abschluss-Handlern angewiesen ist. Der Code verwendet eine benutzerdefinierte NSPersistentContainer-Unterklasse, die Core-Data-Speicher asynchron mit einem Abschluss-Handler lädt. In XCTest verwendete der Autor ein Erwartungsmechanismus, um den asynchronen Vorgang zu testen. Das XCTest-Framework bietet eine Möglichkeit, eine Erwartung zu erstellen, als erfüllt zu markieren und auf ihre Erfüllung innerhalb einer Zeitüberschreitung zu warten. Allerdings verwendet Swift-Testing keine Erwartungen und seine Bestätigungen sind nicht geeignet für das Testen von Abschluss-Handlern. Um den Test zu migrieren, verwendet der Autor eine Swift-Fortsetzung, um den Abschluss-Handler-Aufruf in einen asynchron-kompatiblen Aufruf umzuwandeln. Dieser Ansatz kann auch in XCTest verwendet werden, wodurch die Notwendigkeit von Erwartungen entfällt. Der Nachteil dieses Ansatzes ist, dass das Versäumnis, die Fortsetzungsmethode aufzurufen, den Test blockieren kann und die Fortsetzung genau einmal aufgerufen werden muss. Der Test kann dann leicht zu Swift-Testing migriert werden, indem XCTest-Asserts durch #expect ersetzt werden. Der resultierende Test verwendet eine Swift-Fortsetzung, um den asynchronen Vorgang zu testen und die erwarteten Ergebnisse zu überprüfen. Swift Testing Completion Handlers useyourloaf.com
Tappen auf Stapelansichten Die VStack- und HStack-Ansichten von SwiftUI registrieren keine Berührungen auf leerem Raum innerhalb ihrer Grenzen automatisch. Dieses Problem tritt auf, wenn Gesten an Containeransichten angehängt werden; Berührungen werden nur auf enthaltenen Ansichten registriert. Ein häufiger Workaround besteht darin, eine Hintergrundansicht hinzuzufügen, um den leeren Raum zu füllen. Eine effizientere Lösung verwendet jedoch den contentShape-Modifikator. Der contentShape-Modifikator ermöglicht es, die Form anzugeben, die für die Gestenerkennung verwendet wird. Durch Anwenden von .contentShape(Rectangle()) auf die äußere VStack wird die gesamte Fläche zu einem Berührungsbereich. Dies stellt sicher, dass Berührungen innerhalb der Grenzen der VStack die zugehörige Geste auslösen. Dies löst das Problem, dass Gesten nicht auf Berührungen auf leerem Raum in Containeransichten reagieren. Dieser Ansatz vermeidet die Notwendigkeit unnötiger Hintergrundansichten. Der contentShape-Modifikator bietet eine sauberere und direktere Lösung für die Behandlung von Gesteninteraktionen innerhalb von Containeransichten. Tapping on Stack Views useyourloaf.com
Vorläufige Genehmigung von Benachrichtigungen an Nutzer „Zum Senden von Benachrichtigungen an lokale Benutzer ist eine ausdrückliche Genehmigung des Benutzers erforderlich, die durch Aufrufen der Methode „requestAuthorization“ mit den gewünschten Optionen erfolgen kann. Dies kann den Benutzer jedoch mit einer Berechtigungsabfrage unterbrechen, was möglicherweise nicht optimal ist. Die in iOS 12 eingeführte vorläufige Berechtigung bietet eine Alternative, indem Benachrichtigungen unauffällig zugestellt werden können, ohne den Benutzer zu unterbrechen. Um eine vorläufige Berechtigung anzufordern, füge der Berechtigungsanfrage die Option „.provisional“ hinzu. Bei Verwendung einer vorläufigen Berechtigung werden Benachrichtigungen in das Benachrichtigungscenter mit Schaltflächen zugestellt, mit denen der Benutzer die Benachrichtigungen beibehalten oder deaktivieren kann. Der Benutzer kann festlegen, dass Benachrichtigungen sofort, unauffällig oder als Teil einer geplanten Zusammenfassung zugestellt werden. Eine vorläufige Berechtigung gewährt keine volle Erlaubnis zum Anzeigen von Warnungen oder dem Anbringen einer Plakette auf dem App-Symbol. Hierfür muss der Benutzer seine Benachrichtigungseinstellungen ändern. Berücksichtige beim Überprüfen des Berechtigungsstatus den vorläufigen Status, um die Berechtigung zu prüfen. Eine vorläufige Berechtigung kann für die meisten Apps ein fairer Kompromiss sein, hängt aber letztlich vom jeweiligen Anwendungsfall ab. Die Überprüfung des Berechtigungsstatus vor dem Senden einer Benachrichtigung ist entscheidend, um sicherzustellen, dass Benachrichtigungen korrekt zugestellt werden. Provisional Authorization of User Notificatons useyourloaf.com
SwiftUI-Schaltfläche-Bild bei Betätigung Um das Bild eines SwiftUI-Buttons zu ändern, wenn der Benutzer den Button drückt, können Sie einen benutzerdefinierten Button-Stil erstellen, der einen Titel und zwei Bilder für die Standard- und Druckzustände akzeptiert. Dieser benutzerdefinierte Stil kann durch Erstellen einer Struktur erreicht werden, die dem ButtonStyle-Protokoll entspricht. Die ButtonStyleConfiguration gibt Ihnen Zugriff auf das Button-Label, den isPressed-Zustand und die Button-Rolle, die verwendet werden können, um das anzuzeigende Bild zu bestimmen. In der makeBody-Methode können Sie die Button-Konfiguration überprüfen und ein Label mit dem richtigen Bild basierend auf dem isPressed-Zustand zurückgeben. Dann können Sie diesen benutzerdefinierten Stil verwenden, um einen bestimmten Typ von Button, wie z.B. einen InfoButton, zu erstellen, der den benutzerdefinierten Stil verwendet, um ein anderes Bild anzuzeigen, wenn er gedrückt wird. Der InfoButton kann in Ihrer App verwendet werden, indem Sie ihn mit einer Aktion aufrufen, die ausgeführt werden soll, wenn der Button gedrückt wird. Sie können auch eine Animation zum benutzerdefinierten Stil hinzufügen, um das Bild bei Druck zu skalieren, indem Sie den symbolEffect-Modifier verwenden. Dieser Ansatz ermöglicht es Ihnen, einen ähnlichen Effekt wie die Zustandskonfigurationen von UIKit-Buttons in SwiftUI zu erreichen. Der benutzerdefinierte Button-Stil kann für andere Buttons in Ihrer App wiederverwendet werden, was ihn zu einer praktischen Lösung macht. Insgesamt ist das Erstellen eines benutzerdefinierten Button-Stils eine gute Möglichkeit, das Aussehen von SwiftUI-Buttons anzupassen, insbesondere wenn die integrierten Stile nicht Ihren Anforderungen entsprechen. SwiftUI Button Image When Pressed useyourloaf.com
Reduzierung der Bewegung von Animationen "Der Human Interface Guide von Apple rät davon ab, Bewegungen in einer Benutzeroberfläche hinzuzufügen, ohne dass sie einen bestimmten Zweck erfüllen, da sie die Benutzer ablenken und unangenehm sein können. Bewegungen sollten optional sein und nicht die einzige Möglichkeit sein, wichtige Informationen zu vermitteln. Bestimmte Arten von Bewegungen, wie z.B. oszillierende Bewegungen und große Animationen, können für Benutzer problematisch sein. Benutzer können die Bewegungen in ihren Geräteeinstellungen für Barrierefreiheit reduzieren, was die Standard-Übergänge zwischen Ansichten beeinflussen kann. Allerdings müssen Entwickler bei benutzerdefinierten Animationen selbst tätig werden, indem sie problematische Bewegungen deaktivieren oder ersetzen. Die Einstellung "Bewegung reduzieren" kann in SwiftUI-Ansichten mithilfe der @Environment-Eigenschaft erkannt werden. Die Dokumentation empfiehlt, große Animationen, die die dritte Dimension simulieren, zu vermeiden, wenn die Einstellung "Bewegung reduzieren" aktiviert ist. Um Animationen zu deaktivieren, können Entwickler berechnete Eigenschaften erstellen, die den Zustand der Einstellung "Bewegung reduzieren" berücksichtigen. Dies kann erreicht werden, indem nil für die Animation zurückgegeben wird, wenn die Einstellung "Bewegung reduzieren" aktiviert ist, was die Animation effektiv deaktiviert. Entwickler müssen entscheiden, wann und wie sie auf die Einstellung "Bewegung reduzieren" für ihre eigenen Animationen reagieren." Reducing Motion of Animations useyourloaf.com
Parameterisiertes Testen in Swift Apple stellte Swift-Testing auf der WWDC24 vor, das es ermöglicht, Argumente an eine Testfunktion mittels des @Test-Makros mit dem arguments-Parameter zu übergeben. Diese Funktion ermöglicht parametrisiertes Testen, bei dem die Testfunktion einmal für jeden Wert in der arguments-Sammlung aufgerufen wird. Der Test-Navigator zeigt die Ergebnisse jeder Testausführung an. Wenn zwei Argumente übergeben werden, generiert Swift-Testing Testfälle für alle Kombinationen der beiden Argumente. Es gibt jedoch eine Begrenzung auf maximal zwei Argumente, und wenn nicht alle Kombinationen benötigt werden, können die Argumente gepaart werden, indem sie zusammengezogen werden. Diese Funktion ist nützlich, wenn eine Sammlung von Eingabe-Argumenten getestet werden soll, die dasselbe Ergebnis erwarten. Sie kann besonders praktisch sein, wenn ein CaseIterable-Enum verwendet wird, um die Tests anzutreiben. Der Autor fand diese Funktion nützlich, als er XCTest-basierte Einheitstests auf Swift-Testing migrierte, insbesondere wenn Attribute von Core-Data-Managed-Object-Klassen überprüft werden sollten. Der Swift-Testing-Ansatz hat Vorteile gegenüber der Verwendung einer for-Schleife, einschließlich unabhängiger Testfälle, die parallel laufen können, und klarerer Fehlerberichterstattung. Insgesamt kann parametrisiertes Testen in Swift-Testing Tests vereinfachen und kombinieren, was es zu einer nützlichen Funktion in der Praxis macht. Swift Parameterized Testing useyourloaf.com
XCTest auf Swift-Testing migrieren "Swift Testing ist ein quelloffenes Testframework, das speziell für Swift entwickelt wurde und von Apple auf der WWDC24 vorgestellt und mit Xcode 16 ausgeliefert wurde. Es nutzt moderne Funktionen wie Konkurrenz und Makros und unterstützt neben Apples Plattformen auch Windows und Linux. Es gibt keinen dringenden Grund, von XCTest auf Swift Testing umzustellen, aber Swift Testing bietet mehrere Vorteile, darunter die Möglichkeit, Tests mithilfe von Swift-Konkurrenz in einem Prozess auszuführen, was parallele Tests auf physischen Geräten ermöglicht.Um mit Swift Testing zu beginnen, können Sie XCTest- und Swift-Testing-Einheitstests in einem Testziel mischen, sollten jedoch nicht innerhalb eines Tests verschiedene Testframeworks mischen. Sie können das Swift-Testing-Framework importieren, indem Sie "import Testing" in Ihre Testdatei einfügen. Apple empfiehlt, Tests zu gruppieren, indem Sie sie einem Typ wie einer Struktur oder Klasse hinzufügen und die init-Methode für die Einrichtung und den Abbau verwenden.Swift-Testing-Tests sind normale Swift-Methoden, die zu Einheitstests werden, wenn Sie das @Test-Makro hinzufügen. Sie können Testmethoden mit async oder throws markieren und sie nach Bedarf auf einen Actor isolieren. Das @Test-Attribut ist ein Makro, das erweitert werden kann, um die Implementierung zu sehen.Swift Testing verwendet die #expect- und #require-Makros für Behauptungen, die mehr Flexibilität und informative Fehlermeldungen als XCTest's XCTAssert bieten. Das #expect-Makro protokolliert fehlgeschlagene Erwartungen und setzt den Test fort, während das #require-Makro eine Ausnahme auslöst, die die Testausführung bei einem Fehler stoppt.Sie können auch Issue.record verwenden, um einen Test ohne Auswertung einer Bedingung fehlschlagen zu lassen, ähnlich wie XCTFail in XCTest. Insgesamt bietet Swift Testing mehrere Vorteile gegenüber XCTest, darunter verbesserte Konkurrenzunterstützung und flexiblere Behauptungen." Migrating XCTest to Swift Testing useyourloaf.com
SwiftUI-Funktionen zum Erstellen von Diagrammen Das SwiftUI-Charts-Framework in iOS 18 unterstützt jetzt das Plotten von Funktionen mithilfe von LinePlot und AreaPlot. Diese Diagramme akzeptieren Funktionen, die Doubles in Doubles abbilden. Die Funktionen können undefinierte Werte durch Rückgabe von Double.nan oder Double.infinity handhaben. Eine einzelne Funktion in AreaPlot füllt den Bereich zwischen der Funktion und der x-Achse aus. Zwei Funktionen können einen Bereich zwischen ihnen definieren. Das Plotten von Funktionen hilft bei der Visualisierung von Daten im Vergleich zu erwarteten funktionellen Approximationen. Die Kombination von Balkendiagrammen mit Funktionsplotten ermöglicht einen direkten Vergleich. Ein Beispiel zeigt den Vergleich eines Balkendiagramms mit einer Parabel mithilfe von AreaPlot und LinePlot. Das neue Feature wurde auf der WWDC24 angekündigt. Die Informationen wurden ursprünglich auf useyourloaf.com veröffentlicht. SwiftUI Charts Plotting Functions useyourloaf.com
Automatische Eigenschaftsverfolgung In iOS 18 führt UIKit automatisches Trait-Tracking ein, was die Notwendigkeit eliminiert, manuell für Trait-Änderungsbenachrichtigungen in Layout-Update-Methoden zu registrieren. Dieses Feature wird in verschiedenen Methoden von Ansichten und Ansichts-Controllern unterstützt, darunter UIViews layoutSubviews, updatesConstraints und draw, sowie UI View Controllers viewWillLayoutSubviews und updateViewConstraints. Wenn UIKit eine dieser Methoden aufruft, notiert es, welche Traits zugegriffen werden, und invalidiert die Ansicht automatisch, wenn sich diese Traits ändern. Dies geschieht mithilfe von Methoden wie setNeedsLayout, setNeedsUpdateConstraints, setNeedsDisplay oder setNeedsUpdateConfiguration. Zum Beispiel in einer UIView-Subklasse, die draw überschreibt, den Zugriff auf das preferredContentSizeCategory-Trait auslöst automatisch einen Aufruf von setNeedsDisplay, wenn sich das Trait ändert. Vor iOS 18 mussten Entwickler manuell für Trait-Änderungen registrieren und setNeedsDisplay aufrufen, um einen neuen Aufruf von draw zu trigger. Mit automatischem Trait-Tracking wird dieser Prozess nun von UIKit gehandhabt. Dieses Feature vereinfacht den Prozess der Reaktion auf Trait-Änderungen und reduziert den Codebedarf. Automatisches Trait-Tracking ist ein erheblicher Verbesserung in iOS 18, der es Entwicklern erleichtert, adaptive und responsive Benutzeroberflächen zu erstellen. Automatic Trait Tracking useyourloaf.com
SwiftUI selbst anpassende Flusslayouts Der Artikel behandelt, wie man ein Kartenlayout in SwiftUI mit UICollectionView und UICollectionViewFlowLayout erstellt. Es erläutert, wie man die ideale Größe für die Karten berechnet, die Anzahl der Karten in einer Reihe und Spalte bestimmt und die Unteransichten im Container platziert. Der Artikel deckt auch das Caching ab und wie man das benutzerdefinierte Layout in einem vertikal scrollenden Blickfeld verwendet. SwiftUI Self-Sizing Flow Layouts useyourloaf.com
Bedingte SwiftUI-Barrierefreiheitsbezeichnungen In iOS 18 hat Apple einen optionalen isEnabled-Parameter für verschiedene Barrierefreiheitsmodifikatoren in SwiftUI eingeführt. Dieser Parameter ermöglicht es Entwicklern, Barrierefreiheitsmodifikatoren bedingungsabhängig basierend auf bestimmten Bedingungen anzuwenden. Der isEnabled-Parameter ist für Modifikatoren wie .accessibilityLabel, .accessibilityInputLabels, .accessibilityValue und .accessibilityHint verfügbar. Diese Funktion ist nützlich, wenn Entwickler das Standardverhalten der Barrierefreiheit bedingungsabhängig überschreiben müssen. Beispielsweise kann in einer Liste von Elementen mit einem Button zum Umschalten des Favoritenstatus die Standard-Barrierefreiheitsbezeichnung für die Button-Aktion basierend auf dem Favoritenstatus geändert werden. Anstatt eine bedingte Barrierefreiheitsbezeichnung bereitzustellen, können Entwickler die isEnabled-Variante des Modifikators verwenden, um nur dann eine benutzerdefinierte Bezeichnung anzuwenden, wenn eine bestimmte Bedingung erfüllt ist. Dieser Ansatz vermeidet die Wiederholung und Lokalisierung der Standardbezeichnung. Im angegebenen Beispiel wird der Modifikator .accessibilityLabel mit dem isEnabled-Parameter verwendet, um nur dann eine benutzerdefinierte Bezeichnung „Nicht mehr Favorit“ anzuwenden, wenn das Element als Favorit markiert ist. Dies ist eine kleine Verbesserung, die den Code vereinfacht und den Lokalisierungsaufwand reduziert. Die Einführung des isEnabled-Parameters in iOS 18 erhöht die Flexibilität von Barrierefreiheitsmodifikatoren in SwiftUI. Conditional SwiftUI Accessibility Labels useyourloaf.com