Menu
Coddy logo textTech

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: Dune

Im 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)
high

Eigenschaftsanforderungen 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 3

Wenn 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'
challenge icon

Aufgabe

Einfach

Deklariere 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())")
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground