Protokolle in Swift
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:
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
-
The Swift Programming Language: ProtocolsDie Swift-Dokumentation beschreibt das Sprachfeature Protokolle.
-
Adding Protocol Conformance with an ExtensionKlassen können auch nachträglich über eine Extension zu Protokollen konform gemacht werden.
-
Adopting Common ProtocolsWie werden die Protokolle Equatable und Hashable für eigene Typen korrekt implementiert.