[Swift] Über den Aufzählungstyp

1. Zuallererst


Swift hat eine sehr wichtige Notation ** namens "Aufzählung" **, die wir noch nicht eingeführt haben. Es gibt viele Situationen, in denen der Aufzählungstyp bei der Verwendung sehr effektiv ist. Schauen Sie sich daher bitte meinen Artikel an, insbesondere wenn Sie Swift noch nicht kennen. Es gibt auch einen Aufzählungstyp mit gemeinsamem Typ im Aufzählungstyp, aber ich möchte dies beim nächsten Mal erläutern.

2. Was ist ein Aufzählungstyp?


Der "Aufzählungstyp" in Swift ist im Vergleich zum "Aufzählungstyp" in der Sprache C erheblich erweitert, beispielsweise die Möglichkeit, eine eigene Methode zu definieren. Hier ist ein einfaches Beispiel.

python


enum Direction {
    case up
    case down
    case right
    case left
}

Sie haben jetzt eine "aufgezählte Richtung" definiert. Auf und Ab werden als "Aufzählungsfälle" ("Fall") bezeichnet. Der Fallname wird normalerweise in einem Kamelfall geschrieben, beginnend mit einem Kleinbuchstaben.

Sie können das vorherige Beispiel auch wie folgt schreiben:

python


enum Direction {
    case up, down, right, left
}

Der hier deklarierte "Aufzählungsfall" kann einer Variablen oder Konstante zugeordnet werden. Fallnamen sind nicht global und können mit aufgezählten Namen und "." Beschrieben werden. Wenn Sie jedoch den zu verwendenden Aufzählungstyp kennen, können Sie den Namen des Aufzählungstyps weglassen. Mit anderen Worten, ** Fallnamen werden nicht alleine verwendet, daher ist es sicher, Fallnamen anderer Aufzählungstypen ** zu duplizieren. Zum Beispiel.

python


let d = Direction.up          
var x : Direction = .right    //Wenn der Typ entschieden ist"."Kann beschrieben werden aus
d == x                        //Dies sind unterschiedliche Werte(false)

3. Methodendefinition


Im Gegensatz zur C-Sprache können Sie in Swift Methoden in die Definition des Aufzählungstyps aufnehmen, um das Verhalten und die Funktionalität des gesamten Typs darzustellen. Angenommen, Sie möchten wissen, in welche Richtung sich das Geschäft um 90 ° im Uhrzeigersinn aus jeder Richtung im Aufzählungstyp geöffnet hat, der die vier Richtungen in dem zuvor angegebenen Beispiel zeigt. Dies kann mit einer Methode wie der folgenden definiert werden:

python


enum Direction {
    case up, down, right, left
    func clockwise() -> Direction {
        switch self {
            case .up:    return .right
            case .down:  return .left
            case .right: return .down
            case .left:  return .up
        }
    }
}

Diese Methode kann beispielsweise wie folgt verwendet werden:

python


let d = Direction.up
d.clockwise() == Direction.down              // false
d.clockwise().clockwise() == Direction.down  // true

Auf diese Weise können der Fall "Aufzählungstyp" und die davon abhängigen Prozeduren als eine definiert werden.

4. Aufzählungstyp des Werttyps


Swifts "Aufzählungstyp" hat zusätzlich zu dem bisher beschriebenen "einfachen Aufzählungstyp" ** einen "Werttyp" **, in dem alle Fälle einen Wert desselben Datentyps haben. Es gibt. Mit dem Aufzählungstyp "Werttyp" können Sie alle "Aufzählungsfälle" so definieren, dass sie unterschiedliche Werte desselben Typs haben. Der Typ des Wertes wird als "wesentlicher Typ" des "Aufzählungstyps" bezeichnet, und der jedem Fall zugewiesene Wert wird als "wesentlicher Wert" bezeichnet. Schreiben Sie nach dem neu definierten Typnamen ":" und "substantieller Typ". Sie können jeweils einen Wert schreiben, aber Sie können nur eine Ganzzahl, eine reelle Zahl, einen Bool-Wert oder ein Zeichenfolgenliteral schreiben. Daher kann ein realer Typ ** ein Typ sein, der mit diesen Werten initialisiert werden kann **. Schauen Sie sich die folgende Übersicht an.

Name des Aufzählungstyps: Entitätstyp{
case Fallname=wörtlich
case Fallname=wörtlich
    ... ...

Wenn der "wesentliche Typ" eine Ganzzahl ist, ist der Fall, in dem im Literal kein Wert angegeben ist, der Wert des vorherigen Falls plus eins. Wenn im ersten Fall kein Literal vorhanden ist, ist der Wert 0. Sie können den Wert frei angeben, müssen jedoch sicherstellen, dass keine Fälle mit demselben Wert vorliegen.

Wenn "substantieller Typ" eine Zeichenfolge ist und kein Literal angegeben ist, ist die Zeichenfolge des Fallnamens der Wert von "realer Typ". Wenn der andere Typ als Ganzzahlen und Zeichenfolgen "substantieller Typ" ist, müssen Sie für jeden Fall ein Literal schreiben, damit jeder einen anderen Wert hat.

Sie können Typen zwischen dem Aufzählungstyp und dem Entitätstyp konvertieren. Überprüfen Sie das folgende Beispiel. Definieren Sie den im vorherigen Beispiel erwähnten Richtungstyp so, dass der Int-Typ der tatsächliche Typ ist.

python


enum Direction : Int {
    case up = 0, down, right, left
}

Da der "reale Wert" des ersten Aufwärts auf 0 gesetzt ist, haben der nachfolgende Abwärts-, Rechts- und Linkswert Werte von 1, 2 bzw. 3. Angenommen, Sie haben mehrere Instanzen eines solchen Aufzählungstyps erstellt, können Sie eine Eigenschaft namens rawValue verwenden, um die tatsächlichen Werte abzurufen, die jeder hat.

python


let a = Direction.right
let i = a.rawValue                // i = 2(Int)
let k = Direction.down.rawValue   // k = 1(Int)

Um umgekehrt eine Instanz des entsprechenden Aufzählungstyps aus dem Wert des Entitätstyps abzurufen, verwenden Sie den Initialisierer init? (RawValue :). Dieser Initialisierer ist ein "fehlgeschlagener Initialisierer", da der korrekte Wert nicht zurückgegeben werden kann, wenn kein "Aufzählungsfall" vorliegt, der dem Wert des "realen Typs" entspricht. Siehe das folgende Beispiel.

python


let b : Direction? = Direction(rawValue:3)
b! == Direction.left                  // true
if let c = Direction(rawValue:2) {    //Optionale Bindungssyntax
    print("OK \(c.rawValue)")         // "OK 2"
}

Schreiben wir die zuvor geschriebene Gliederung mit dem Werttyp "Aufzählungstyp" neu. Wenn Sie die Richtungsfälle im Uhrzeigersinn definieren, müssen Sie nicht alles in der switch-Anweisung auflisten. Sie müssen die Instanz selbst in der Funktion darstellen, aber dafür verwenden wir das reservierte Wort self. Schauen Sie sich das Beispiel an.

python


enum Direction : Int {
    case up = 0, right, down, left       //Im Uhrzeigersinn neu anordnen
    func clockwise() -> Direction {
        let t = (self.rawValue + 1) % 4  //Selbst ist die Instanz selbst
        return Direction(rawValue:t)!    //Wird nicht Null sein

5. Methoden und Eigenschaften für Aufzählungstypen


Sie können auch Eigenschaften für den Aufzählungstyp definieren, aber im Gegensatz zu Strukturen können Sie nur ** Berechnungseigenschaften ** definieren. Lassen Sie mich ein Beispiel geben.

python


enum Direction : Int {
    case up = 0, right, down, left  //im Uhrzeigersinn
    /* ...Unterlassung... */
    var horizontal: Bool {          //Eigenschaftsdefinition nur für get-Klausel
        switch self {
        case .right, .left: return true
        default: return false
        }
    }
    mutating func turnBack() {
        self = Direction(rawValue:((self.rawValue + 2) % 4))!
    }
}

Für den bisher als Beispiel angegebenen Richtungstyp haben wir eine Berechnungseigenschaft horizontal definiert, die true zurückgibt, wenn der Wert horizontal, rechts oder links darstellt. Dieses Beispiel zeigt auch ein Beispiel für die Definition einer Methode mit einem Muting-Attribut für einen Aufzählungstyp.

Im Gegensatz zu Strukturen ändert es den in der Variablen gespeicherten Wert des Aufzählungstyps selbst, indem es dem sich selbst darstellenden Selbst einen anderen Wert zuweist. Nicht verfügbar, wenn der Wert in einer Konstanten gespeichert ist. Hier wird dem Richtungstyp eine Methode turnBack hinzugefügt, die in die entgegengesetzte Richtung invertiert.

Sehen wir uns ein Ausführungsbeispiel an.

python


var d = Direction.left
print(d.rawValue)    //3 wird ausgegeben
d.turnBack()
print(d.rawValue)    //1 wird ausgegeben(3 entgegengesetzte Richtungen)
print(d.horizontal)  //true ist die Ausgabe

6. Initialisierer des Aufzählungstyps und Typmethode


Sie können Typmethoden, Typeneigenschaften und Initialisierer für Aufzählungstypen sowie Strukturen definieren. Schreiben Sie für Typmethoden und Typmethoden das Schlüsselwort "static" am Anfang der Funktionsdefinition oder Variablendefinition. Der Initialisierer definiert, was "self" zugewiesen werden soll. Es ist auch möglich, den automatisch vorbereiteten Initialisierer init? (RawValue :) neu zu definieren. Überprüfen Sie das folgende Beispiel.

python


enum Direction : Int {
    case up = 0, right, down, left
    static var defaultDirection = Direction.up
    init() {
        self = Direction.defaultDirection
    }
    // ...Unterlassung...
}

Hier wird eine Variable namens defaultDirection vorbereitet. Wenn eine Instanz mit dem Initialisierer init () erstellt wird, wird dieser Wert als Anfangswert verwendet.

Ein Ausführungsbeispiel ist unten gezeigt.

python


Direction.defaultDirection = .right    //Als Anfangswert nach rechts setzen
let e = Direction()                    //Verwenden Sie den Initialisierer
let g = Direction(rawValue:1)          //Initialisierer für die Aufzählung von Werttypen
print(e == g)                          // true

7. Schlussfolgerung


Dieses Mal erklärte ich den Aufzählungstyp, der in Swift eine sehr wichtige Notation ist. Das nächste Mal werde ich einen Artikel über "Typ der gemeinsamen Aufzählung" schreiben. Schauen Sie also bitte dort nach, wenn der Artikel nächste Woche hochgeladen wird. Vielen Dank, dass Sie so weit gelesen haben.

Recommended Posts

[Swift] Über den Aufzählungstyp
[Swift] Aufzählungstyp für gemeinsam genutzte Typen
Überprüfen Sie den Swift-Aufzählungstyp
[Swift] [Anfänger]] Über den Bereichsoperator
Informationen zu Java Class Loader-Typen
Informationen zu Arten der Codeabdeckung
[Swift] Ich dachte über Vergleiche nach
[Swift] Über die iterative Verarbeitung von "for-in-Anweisungen"
Über =
Informationen zu primitiven Java-Typen und Referenztypen
[Swift] Ein Hinweis zu Funktion und Schließung