Aufzählungen sind in vielen Programmiersprachen ein verbreitetes Entwurfsmuster. Obwohl Sie mit Aufzählungen in C und Objective-C vertraut sind, ist die Implementierung von Aufzählungen durch Swift wesentlich leistungsfähiger und flexibler. In diesem kurzen Tipp erfahren Sie, was an Aufzählungen in Swift besonders ist, wie Sie sie in Ihren Projekten einsetzen können und was sie so leistungsfähig macht.
Aufzählungen sind nicht neu und sicherlich nicht einzigartig für Swift. Wenn Sie jedoch mit Aufzählungen in C vertraut sind, werden Sie Swifts mächtige Version von Aufzählungen lieben.
Wenn Aufzählungen oder Aufzählungen für Sie neu sind, sind Sie möglicherweise nicht mit deren Angebot vertraut. In Swift sind Aufzählungen erste Klassentypen, die eine Liste möglicher Werte für diesen Typ definieren.
Ein Beispiel könnten die möglichen Zustände einer Netzwerkverbindung sein. Die möglichen Zustände könnten sein:
Wir könnten einen vierten Zustand hinzufügen, falls der Zustand unbekannt ist. In diesem Beispiel wollen wir sehen, wie eine solche Aufzählung definiert und implementiert wird.
Wie ich schon sagte, sind Aufzählungen erstklassige Typen in Swift. Eine Aufzählungsdefinition sieht einer Klassen- oder Strukturdefinition sehr ähnlich. Im folgenden Beispiel definieren wir die ConnectionState
Aufzählung.
enum ConnectionState
Dem Namen der Aufzählung wird das vorangestellt enum
Stichwort und gefolgt von einem Paar geschweifte Klammern. Das ConnectionState
Die Aufzählung definiert die möglichen Zustände einer Netzwerkverbindung. Um diese Zustände zu definieren, fügen wir hinzu Mitgliederwerte oder Mitglieder zur Definition der Aufzählung. Die Definition eines Member-Werts beginnt immer mit dem Fall
Stichwort.
enum ConnectionState Fall unbekannter Fall getrennter Fall Verbindungsfall verbunden
In C oder Objective-C würde die obige Aufzählung etwas anders aussehen, wie im folgenden Beispiel dargestellt. Jeder Wert der Aufzählung entspricht beispielsweise einer ganzen Zahl, ConnectionStateUnknown
gleich 0
, ConnectionStateDisconnected
gleich 1
, usw.
typedef Aufzählung: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;
Dies trifft in Swift nicht zu. Die Mitglieder einer Aufzählung entsprechen nicht automatisch einem ganzzahligen Wert. Die Mitglieder der ConnectionState
Aufzählung sind Werte selbst und sie sind vom Typ ConnectionState
. Dies macht die Arbeit mit Aufzählungen sicherer und expliziter.
Es ist möglich, die Werte der Mitglieder einer Aufzählung explizit anzugeben. Im folgenden Beispiel zeigen die Mitglieder des ConnectionState
Aufzählung hat einen Rohwert vom Typ Int
. Jedem Member wird ein Rohwert zugewiesen, der einer ganzen Zahl entspricht.
enum ConnectionState: Int case Unknown = -1 case Disconnected = 0 case Connecting = 1 case Verbunden = 2
Beachten Sie, dass wir den Typ der Rohwerte in der Definition der Aufzählung angeben und dass keine zwei Elementwerte denselben Rohwert haben dürfen. Wenn wir nur einen Wert für angeben unbekannte
Mitglied, dann erhöht Swift automatisch den Wert von unbekannte
member und weisen Sie den anderen Mitgliedern der Aufzählung eindeutige Werte zu. Zur besseren Veranschaulichung ist das folgende Beispiel identisch mit der vorherigen Definition des ConnectionState
Aufzählung.
enum ConnectionState: Int case Unknown = -1 case Disconnected case Verbindungsfall verbunden
Verwendung der ConnectionState
Die Aufzählung ähnelt der Verwendung anderer Typen in Swift. Im nächsten Beispiel deklarieren wir eine Variable, connectionState
, und setze seinen Wert auf ConnectionState.Connecting
.
var connectionState = ConnectionState.Connecting
Der Wert von connectionState
ist ConnectionState.Connecting
und die Variable ist vom Typ ConnectionState
.
Die Typinferenz von Swift ist sehr praktisch, wenn Sie mit Aufzählungen arbeiten. Weil wir erklärt haben connectionState
als vom Typ sein ConnectionState
, Wir können jetzt einen neuen Wert zuweisen, indem Sie die Kurzschreibungspunktsyntax für Aufzählungen verwenden.
connectionState = .Connected
Verwenden von Aufzählungen in einem ob
oder Schalter
Aussage ist unkompliziert. Erinnere dich daran Schalter
Aussagen müssen erschöpfend sein. Füge hinzu ein Standard
falls erforderlich.
enum ConnectionState case Unbekannter Fall Getrennter Fall Verbindungsfall Connected var connectionState = ConnectionState.Connecting connectionState = .Connected Switch ConnectionState Fall. Disconnected: println ("Disconnected") case .Connecting: println ("Connecting") case .Connected: println ("Verbunden") Standard: println ("Unknown State")
Das folgende Beispiel zeigt, wie das ConnectionState
enum kann verwendet werden. Außerdem wird gezeigt, wie auf den zugehörigen Wert eines Enumerationsmitglieds zugegriffen werden kann. Das canConnect
Funktion akzeptiert a ConnectionState
Instanz und gibt ein Bool
.
func canConnect (connectionState: ConnectionState) -> Bool var result = false switch Verbindungsstatus case .Connected (let port): wenn port == 3000 result = true default: result = false return result let state = ConnectionState. Verbunden (3000) if canConnect (state) //…
Das canConnect
Funktion gibt nur zurück wahr
wenn die ConnectionState
Die an die Funktion übergebene Instanz ist gleich .In Verbindung gebracht
und der zugehörige Wert ist ein Int
gleich 3000
. Beachten Sie, dass der zugehörige Wert von In Verbindung gebracht
Mitglied ist in der Schalter
Anweisung als eine Konstante namens Hafen
, das können wir dann im entsprechenden verwenden Fall
.
Ein weiteres überzeugendes Merkmal von Swift Enums sind zugehörige Werte. Jedes Mitglied einer Aufzählung kann einen zugehörigen Wert haben. Zugehörige Werte sind sehr flexibel. Beispielsweise müssen zugeordnete Werte verschiedener Mitglieder derselben Enumeration nicht vom selben Typ sein. Sehen Sie sich das folgende Beispiel an, um das Konzept der zugehörigen Werte besser zu verstehen.
enum ConnectionState case Unbekannter Fall Getrennter Fall Connecting (Int, Double) Case Verbunden (Int)
Das unbekannte
und Getrennt
Mitglieder haben keinen zugehörigen Wert. DasAnschließen
Mitglied hat einen zugehörigen Wert des Typs (Int, Double)
, Angeben der Portnummer und des Timeout-Intervalls der Verbindung. Das In Verbindung gebracht
Mitglied hat einen zugehörigen Wert des Typs Int
, Angabe der Portnummer.
Es ist wichtig zu verstehen, dass ein zugeordneter Wert mit einem Enumeration-Mitglied verknüpft oder diesem zugeordnet ist. Der Wert des Mitglieds bleibt unverändert. Das nächste Beispiel zeigt, wie ein erstellt wird ConnectionState
Instanz mit einem zugehörigen Wert.
var connectionState = ConnectionState.Connecting (3000, 30.0)
Aufzählungen sind in Swift ziemlich mächtig. Aufzählungen können sogar Methoden definieren, z. B. einen Initialisierer, um einen Standardelementwert auszuwählen, wenn keiner angegeben wurde.
enum ConnectionState case Unbekannter Fall Getrennter Fall Connecting (Int, Double) Case verbunden (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown
In diesem Beispiel initialisieren wir eine Instanz von ConnectionState
Aufzählung, ohne explizit einen Wert dafür anzugeben. Im Initialisierer der Aufzählung setzen wir jedoch die Instanz auf unbekannte
. Das Ergebnis ist, dass die connectionState
Variable ist gleich ConnectionState.Unknown
.
Enumerationen sind wie Strukturen Werttypen. Das bedeutet, dass eine Enumeration nicht wie Klasseninstanzen als Referenz, sondern als Wert übergeben wird. Das folgende Beispiel veranschaulicht dies.
var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) // .Connected (1000) println (connectionState2) // .Unbekannt
Obwohl wir vergeben connectionState1
zu connectionState2
, die Werte von connectionState1
und connectionState2
sind am Ende des Beispiels unterschiedlich.
Wann connectionState1
ist zugeordnet connectionState2
, Swift erstellt eine Kopie von connectionState1
und ordnet das zu connectionState2
. Mit anderen Worten, connectionState1
und connectionState2
verweisen auf zwei verschiedene ConnectionState
Instanzen.
Enumerationen in Swift sind im Vergleich zu Enumerationen in C unglaublich mächtig. Einer der mächtigsten Aspekte von Enumerationen ist, dass es sich um erstklassige Typen in Swift handelt. Die Textsicherheit ist ein Schlüsselaspekt der Swift-Sprache, und Aufzählungen passen perfekt in diese Denkweise.