Protokolle definieren
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 27 von 57.
Ein Protokoll listet Anforderungen (Methoden und Eigenschaften) auf, ohne sie zu implementieren. Ein Typ konform mit dem Protokoll, indem er jede Anforderung bereitstellt, und kann anschließend überall dort verwendet werden, wo das Protokoll erwartet wird:
protocol Describable {
func describe() -> String
}
struct Book: Describable {
let title: String
func describe() -> String { "Book: \(title)" }
}
print(Book(title: "Dune").describe())Ausgabe:
Book: DuneIm Gegensatz zur Vererbung funktioniert ein Protokoll gleichermaßen für Strukturen, Klassen und Aufzählungen, und ein Typ kann mehreren Protokollen entsprechen. Das Protokoll legt nur fest, was ein Typ tun kann; jeder Typ entscheidet selbst, wie:
protocol Describable {
func describe() -> String
}
struct Point: Describable {
var x = 0, y = 0
func describe() -> String { "(\(x), \(y))" }
}
enum Level: Describable {
case low, high
func describe() -> String { self == .low ? "low" : "high" }
}
print(Point(x: 1, y: 2).describe())
print(Level.high.describe())Ausgabe:
(1, 2)
highEigenschaftsanforderungen geben den Typ und an, ob die Eigenschaft schreibgeschützt ({ get }) oder auch beschreibbar ({ get set }) ist. Eine { get }-Anforderung kann durch eine gespeicherte oder eine berechnete Eigenschaft erfüllt werden:
protocol Named {
var name: String { get }
}
struct User: Named {
let name: String
}
struct Planet: Named {
var number: Int
var name: String { "Planet \(number)" }
}
print(User(name: "ada").name)
print(Planet(number: 3).name)Ausgabe:
ada
Planet 3Wenn ein Typ behauptet, einem Protokoll zu entsprechen, aber eine Anforderung nicht erfüllt, wird er nicht kompiliert. Der Compiler überprüft jede Konformität, sodass Code, der das Protokoll verwendet, darauf vertrauen kann:
protocol Priced {
var price: Int { get }
func discounted(by percent: Int) -> Int
}
// struct Ticket: Priced { var price = 10 }
// error: type 'Ticket' does not conform to protocol 'Priced'Aufgabe
EinfachDeklariere ein Protokoll Shape mit einer schreibgeschützten Eigenschaft name (String) und einer Methode area(), die Double zurückgibt. Lass die Strukturen Rectangle (width, height) und Circle (radius, wobei 3.0 für π verwendet wird, damit die Zahlen einfach bleiben) diesem Protokoll entsprechen, mit den Namen rectangle und circle.
Der bereitgestellte Code liest Zeilen wie r,3,4 oder c,2, erstellt die passende Form und gibt rectangle: 12.0 aus.
Dein Code gehört in Shape.swift, Rectangle.swift und Circle.swift. main.swift enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: ",").map(String.init)
if p[0] == "r" {
let s = Rectangle(width: Double(p[1])!, height: Double(p[2])!)
print("\(s.name): \(s.area())")
} else {
let s = Circle(radius: Double(p[1])!)
print("\(s.name): \(s.area())")
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Eigenschaften im Detail
Berechnete EigenschaftenEigenschaftsbeobachterStatische MemberEnums mit MethodenRückblick – Temperaturprotokoll6Protokolle
Protokolle definierenTypen konform machenProtokollerweiterungenProtokolle als TypenRückblick – ZahlungssystemÜbe selbstständig: Swift-Playground