Grundlegende Funktionsweise
SwiftUI ist ein Framework zur Erstellung von Nutzeroberflächen für alle Plattformen von Apple. Basis bei der Arbeit mit diesem Framework ist dessen Protokoll View
. Es definiert, wie eine spezifische Ansicht, die mit SwiftUI erstellt wird, aussieht und welche Funktionen sie besitzt (wobei „Funktionen“ sich in diesem Kontext ausschließlich auf UI-spezifische Aktionen wie das Auslösen eines Buttons bezieht).
In gewisser Weise kann das View
-Protokoll in seiner Funktion mit den Klassen NSView
und UIView
aus dem AppKit– beziehungsweise UIKit-Framework verglichen werden, da es die Basis einer jeden mit SwiftUI erstellten Ansicht darstellt. Ein großer Unterschied von View
zu NSView
und UIView
besteht aber darin, dass letztere beiden Klassen sind, von denen typischerweise Subklassen generiert werden, die dann die eigene Funktionalität einer View enthalten. View
hingegen ist ein Protokoll, was zur Folge hat, dass alle Eigenschaften und Funktionen einer Ansicht fast vollständig in der jeweiligen View selbst definiert werden.
Herzstück des View
-Protokolls ist eine Property namens body
. Jede mit SwiftUI erstellte View muss wenigstens diese Eigenschaft des View
-Protokolls adaptieren. Ihre Aufgabe besteht darin, die gewünschte View zu generieren und am Ende zurückzugeben.
Eine erste eigene View
Betrachten wir in diesem Kontext einmal ein simples Beispiel, wie eine einfache View bei der Arbeit mit SwiftUI aussehen kann, die schlicht ein Label mit dem Text „Hello World“ zurückliefert. Dazu erzeugt man eine neue Structure und gibt ihr einen passenden Namen, beispielsweise HelloWorldView
. Diese Structure muss konform zum View
-Protokoll sein. Anschließend implementiert man darin die body
-Property, die einen Wert vom Typ some View
zurückgibt. Das Schlüsselwort some
bezieht sich in diesem Kontext auf eine Neuerung in Swift 5.1, auf der auch SwiftUI basiert und die final im Herbst erscheinen wird. some View
drückt in diesem Zusammenhang aus, dass die body
-Property eine Instanz zurückliefert, die ebenfalls konform zum View
-Protokoll ist, ohne dass body
aber weiß, welchem Typ dieser Rückgabewert explizit entspricht. Es kann sich hierbei also um ein Label, ein Textfeld, eine Liste, ein Bild oder eine beliebige Komposition aus diesen und weiteren View-Elementen handeln.
Ein Label erstellt man in SwiftUI typischerweise mithilfe des Text
-Elements, einer Structure, deren Initializer einen String erwartet. Genau dieser String wird dann als Inhalt des Labels auf dem Display ausgegeben.
Den vollständigen Aufbau der beschriebenen View zeigt das folgende Listing:
struct HelloWorldView : View {
var body: some View {
Text("Hello World")
}
}
Eine Anmerkung hierbei noch zur Implementierung der body
-Property. Womöglich fragt ihr euch, warum die darin erstellte View (das Label auf Basis der Text
-Instanz) nicht mittels return
zurückgegeben wird. Auch das hängt mit einer Neuerung in Swift 5.1 zusammen. Die erlaubt es nämlich, innerhalb eines Getters auf return
zu verzichten, sollte die Implementierung aus nur einem einzigen Befehl bestehen. In dem gezeigten Beispiel ist das der Fall und die Initialisierung der Text
-Instanz liefert genau das gewünschte Ergebnis zurück. Selbstverständlich könnte man aber vor dem Befehl Text("Hello World")
auch noch ein return
setzen; falsch ist das nicht und das Ergebnis wäre exakt das gleiche.
Fazit
Das Grundkonzept zum Erstellen von Views in SwiftUI unterscheidet sich doch deutlich von dem Vorgehen, wie man es bisher auf der Grundlage von NSView
und UIView
gewohnt ist. Basis ist nun das View
– Protokoll und dessen body
-Property. Letztere bestimmt, wie eine View aussieht und aus welchen verschiedenen Elementen sie sich zusammensetzt.
Hinzu kommen einige Neuerungen aus der kommenden Swift-Version 5.1, von denen SwiftUI explizit Gebrauch macht, die aber ohne entsprechende Kenntnisse auf den ersten Blick verwirrend und sogar falsch anmuten. Warum fehlt in der body
-Implementierung der Aufruf von return
? Und was bedeutet das neue Keyword some
? Diese Fragen treten wohl mit als Erstes auf, wenn man sich mit SwiftUI beschäftigt, und mit diesem Artikel wären sie wohl fürs Erste geklärt. 🙂
Euer Thomas
Schreibe einen Kommentar