Ändern Sie Ihre Einstellung mit SwiftUI

Bild

Letzte Woche habe ich gesehen, dass die Community versucht, bewährte Entwicklungsmuster von UIKit auf SwiftUI zu übertragen. Ich bin mir jedoch sicher, dass der beste Weg, um mit SwiftUI effizienten Code zu schreiben, darin besteht, alles an UIKit zu vergessen und Ihr Denken in Bezug auf die Entwicklung der Benutzeroberfläche vollständig zu ändern. Diese Woche werde ich über die Hauptunterschiede zwischen der Entwicklung mit UIKit und SwiftUI sprechen.

Definition von Unterschieden


UIKit ist ein unverzichtbares ereignisgesteuertes Framework zum Erstellen von Benutzeroberflächen für die iOS-Plattform. Dies bedeutet, dass Sie alle Statusänderungen während Ereignissen wie dem Laden einer Ansicht, dem Klicken auf eine Schaltfläche usw. verarbeiten müssen. Ein großer Nachteil dieses Ansatzes ist die Schwierigkeit, die Benutzeroberfläche mit ihrem Status zu synchronisieren. Sobald sich der Status ändert, müssen Sie die Ansichten manuell hinzufügen / löschen / anzeigen / verbergen und mit dem aktuellen Status der Anwendung synchronisieren.

SwiftUI ist ein deklaratives Framework zum Erstellen von Benutzeroberflächen für alle Apple-Plattformen. Das Schlüsselwort ist in diesem Fall deklarativ. Deklarativ bedeutet, dass der Entwickler deklarieren muss, was er erreichen möchte, und das Framework wird sich darum kümmern. Das Framework kennt die beste Methode zum Rendern der Benutzeroberfläche.

UI = f(state) 

In SwiftUI ist die Benutzeroberfläche eine Funktion ihres Zustands. Dies bedeutet, dass bei jeder Änderung des Zustands einer Ansicht deren Körpereigenschaft neu erfasst und eine neue Ansicht generiert wird. Betrachten Sie das folgende Beispiel.

 struct ContentView: View { @ObservedObject var store: Store var body: some View { Group { if store.isLoading { Text("Loading...") .font(.subheadline) } else { Image("photo") .font(.largeTitle) } } } } 

Im obigen Beispiel gibt es eine Ansicht, in der der Text "Loading ..." und am Ende des Downloads Bilder angezeigt werden. ObserverObject ist der Status dieser Ansicht. Sobald sich diese ändert, berechnet SwiftUI die Body-Eigenschaft neu und weist eine neue Ansicht zu. Während der Entwicklung mit UIKit müssen die Elemente der Präsentationshierarchie manuell ausgeblendet / angezeigt werden. In SwiftUI muss jedoch kein Ladeindikator hinzugefügt / entfernt werden. In SwiftUI gibt es verschiedene Möglichkeiten, den Status einer Ansicht zu beschreiben. Weitere Informationen finden Sie unter „ Eigenschaften-Wrapper in SwiftUI “.

Jetzt schauen wir uns genauer an, was passiert, wenn sich der Ansichtsstatus ändert. SwiftUI verfügt über einen Abdruck der aktuellen Hierarchie von Ansichten und berechnet, sobald sich der Status ändert, eine neue Ansicht. SwiftUI wendet Vergleichsalgorithmen an, um die Unterschiede zu verstehen und die erforderlichen Ansichten automatisch hinzuzufügen / zu entfernen / zu aktualisieren. Standardmäßig verwendet SwiftUI das standardmäßige Ein- / Aus-Übergangsbild, um Ansichten anzuzeigen / auszublenden. Es ist jedoch auch möglich, den Übergang zu einer anderen Animation manuell zu ändern. Weitere Informationen zu Übergängen und Animationen in SwiftUI finden Sie in meinem Artikel „ Animationen in SwiftUI “.

Präsentationshierarchie


Lassen Sie uns über die Hierarchie der Ansichten sprechen und wie SwiftUI die Struktur der Ansichten tatsächlich anzeigt. Das allererste, was ich erwähnen möchte, ist, dass SwiftUI die Struktur der Ansicht nicht durch eine Eins-zu-Eins-Zuordnung anzeigt. Es können beliebig viele Ansichtscontainer verwendet werden. Letztendlich zeigt SwiftUI jedoch nur die Ansichten an, die für das Rendern sinnvoll sind. Dies bedeutet, dass Sie ihre Logik in kleine Darstellungen extrahieren und sie dann in der Anwendung komponieren und wiederverwenden können. Keine Sorge, die Anwendungsleistung wird in diesem Fall nicht leiden. Weitere Informationen zum Erstellen von Ansichten in SwiftUI finden Sie in diesem Artikel .

Der beste Weg, die Hierarchie komplexer Darstellungen in SwiftUI zu verstehen, ist die Anzeige ihres Typs. SwiftUI verwendet ein statisches Typsystem, um den Unterschied schnell genug zu bestimmen. Zunächst wird der Ansichtstyp und anschließend die Werte der Komponenten der Ansicht überprüft. Ich bin kein Fan von Reflektionen im Arbeitscode, aber es ist sehr nützlich im Lernprozess.

 print(Mirror(reflecting: ContentView(store: .init()).body)) // Group<_ConditionalContent<Text, ModifiedContent<Image, _EnvironmentKe 

Mithilfe der Mirror-Struktur können Sie den tatsächlichen Typ des ContentView-Körpers anzeigen und herausfinden, wie SwiftUI funktioniert.

Schlussfolgerungen


Diese Woche haben wir den Hauptunterschied zwischen UIKit und SwiftUI erfahren und den Vergleichsalgorithmus in SwiftUI im Detail untersucht. Ich hoffe dir hat der Artikel gefallen. Vielen Dank fürs Lesen und bis nächste Woche!

Source: https://habr.com/ru/post/de477560/


All Articles