20. Oktober 2018

Klassen- und Methodendeklaration in Swift

Klassendeklaration

Klassen werden in Swift mit class deklariert:

class Counter {
}

Die Datei, in der eine Klasse deklariert wird, muss nicht gleichnamig zur Klasse sein und es können mehrere Klassen in einer Swift-Datei deklariert werden.

Eigenschaften

Swift unterscheidet nicht zwischen Instanzvariablen und Eigenschaften. Die Deklaration einer Variablen oder Konstanten innerhalb einer Klasse wird standardmäßig zu einer öffentlichen Eigenschaft der Klasse (implementiert über Getter-/Setter-Methoden, die auf eine Instanzvariable zugreifen):

class Counter {
    let maxCount = 10
    var value = 0
}

let counter = Counter()
counter.value = 5

Methodendeklarationen

Wird eine Funktion innerhalb einer Klasse definiert, wird diese zu einer Methode der Klasse. Mit dem Schlüsselwort self wird auf Eigenschaften und Methoden der Klasse zugegriffen (kann entfallen, sofern keine gleichnamige lokale Variable definiert ist):

class Counter {
    var value = 0

    func increment() {
        self.value += 1
    }

}

let counter = Counter()
counter.increment()

Mit init und deinit (Deklaration ohne func) können Konstruktoren und Destruktoren definiert werden:

class Counter {
    var value : Int

    init() {
        self.value = 0
    }

    init(initialValue: Int) {
        self.value = initialValue
    }

    deinit {
        print("Counter wurde zerstört")
    }
}

Vererbung

In Swift können Klassen von einer Klasse abgeleitet werden. Sie erben damit das Verhalten der Basisklasse und können dieses anpassen und erweitern. Wird eine Methode der Basisklasse überschrieben, muss dies mit override explizit deklariert werden. Mit super kann die überschriebene Methode der Basisklasse aufgerufen werden:

class LoggingCounter : Counter {

    override func increment() {
        super.increment()
        print("Counter \(self) wurde inkrementiert")
    }

}

Manchmal werden Klassen von der Foundation-Klasse NSObject abgeleitet, da sie dadurch kompatibel zu Objective-C werden und in bestehendem Objective-C Code verwendet werden können:

class Counter : NSObject {
    // ...
}

Tutorial 1: Modell-Klassen implementieren

  1. Laden Sie den Start-Stand von dem Flashcards-Beispielprojekt: Flashcards.zip.

  2. Erstellen Sie über das Kontextmenü der Gruppe Flashcards mit New File... eine neue Klasse (dadurch wird die Datei automatisch in dieser Gruppe und im zugehörigen Ordner im Dateisystem abgelegt):

    New File

    Hinweis: Verwenden Sie für das Anlegen von neuen Dateien im Folgenden immer „New File...” für die entsprechende Gruppe. Dadurch wird sichergestellt, das die neue Datei sowohl im Xcode-Projekt als auch im Dateisystem im korrekten Ordner erstellt wird.

  3. Wählen Sie iOS » Source » Swift File aus und erstellen Sie eine neue Swift-Datei Card.swift:

    iOS » Source » Swift File

  4. Erstellen Sie zur besseren Gliederung mit New Group From Selection eine Gruppe Model für die angelegte Datei Card.swift.

  5. Implementieren Sie die Klasse Card so, dass Daten für eine Lernkarte - ein Text für die Vorder- und Rückseite - gehalten und beim Erzeugen des Objektes übergeben werden können:

    class Card {
    
        var frontText : String
        var backText : String
    
        init(frontText : String, backText : String) {
            self.frontText = frontText
            self.backText = backText
        }
    
    }
  6. Erstellen Sie in der Gruppe Model eine zweite Klasse FlashcardsModel, die die in der App geladenen Lernkarten hält und erzeugen Sie hier einige beispielhafte Card-Objekte:

    class FlashcardsModel {
    
        var cards = [
            Card(frontText: "bird", backText: "Vogel"),
            Card(frontText: "tree", backText: "Baum")
        ]
    
    }
  7. Machen Sie das FlashcardsModel zu einem Singleton-Objekt, indem Sie eine statische-Eigenschaft shared und einen privaten Initializer anlegen, der die Verwendung des Singleton-Objektes erzwingt:

    class FlashcardsModel {
    
        static let shared = FlashcardsModel()
    
        private init() {
        }
        
        // ...
        
    }
  8. Committen Sie die Änderungen als „5.1. FlashcardsModel erstellt“.