Protokolle in Swift

von @ralfebert · veröffentlicht am 1. April 2018

Mit einem Protokoll kann in Swift ein Schnittstellenkontrakt definiert werden. Das Protokoll gibt dabei an, welche Methoden vorhanden sein müssen. Zum Beispiel:

protocol Account {
    func withdraw(amount : Int)
    func deposit(amount : Int)
}

Auch Eigenschaften können dabei vom Protokoll gefordert werden - dabei besteht die Möglichkeit anzugeben, ob diese nur gelesen oder auch verändert werden dürfen:

protocol Account {
    var balance : Int { get set }

    func withdraw(amount : Int)
    func deposit(amount : Int)
}

Klassen, die die Anforderungen des Protokolls erfüllen, können als konform zu dem Protokoll deklariert werden:

class CheckingAccount : Account {
    // ...
}

Tipp: Die zu implementierenden Methoden können von Xcode automatisch erstellt werden:

Protokollmethoden von Xcode anlegen lassen

Beispielsweise wäre folgende Implementierung konform zu dem Account-Protokoll:

class CheckingAccount : Account {
    var balance = 0

    func withdraw(amount : Int) {
        balance -= amount
    }

    func deposit(amount : Int) {
        balance += amount
    }
}

Bei der Verwendung des Protokoll-Typs wird die konkrete Implementierung hinter dem Protokoll „versteckt“. So akzeptiert beispielsweise eine Funktion, die einen Wert vom Typ Account übergeben bekommt, jeden Wert, der konform zu dem Protokoll ist:

func transfer(amount : Int, fromAccount : Account, toAccount : Account) {
    fromAccount.withdraw(amount: amount)
    toAccount.deposit(amount: amount)
}

Um welchen Typ es sich dabei konkret handelt, spielt für die Funktion keine Rolle:

let account1 = CheckingAccount()
let account2 = CheckingAccount()
transfer(amount: 10, fromAccount: account1, toAccount: account2)

Weitere Informationen