Rozszerzenia protokołów
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 29 z 57.
Rozszerzenie protokołu zapewnia domyślną implementację metod protokołu. Każdy typ zgodny z protokołem otrzymuje ją za darmo, a typ nadal może dostarczyć własną wersję:
protocol Greeter {
var name: String { get }
func greet() -> String
}
extension Greeter {
func greet() -> String { "Hello, \(name)!" }
}
struct English: Greeter { let name: String }
struct Pirate: Greeter {
let name: String
func greet() -> String { "Ahoy, \(name)!" }
}
print(English(name: "Ada").greet())
print(Pirate(name: "Ada").greet())Wynik:
Hello, Ada!
Ahoy, Ada!Rozszerzenie może też dodawać nowe metody zbudowane wyłącznie na podstawie wymagań. Typ zgodny z protokołem zapisuje niewielką wymaganą część i otrzymuje resztę:
protocol Scored {
var points: [Int] { get }
}
extension Scored {
var total: Int { points.reduce(0, +) }
var best: Int { points.max() ?? 0 }
func summary() -> String { "total \(total), best \(best)" }
}
struct Player: Scored {
let points: [Int]
}
print(Player(points: [3, 9, 4]).summary())Wynik:
total 16, best 9Umożliwia to współdzielenie zachowania przez struktury, klasy i typy wyliczeniowe bez dziedziczenia. Biblioteka standardowa działa tak samo: każde Collection otrzymuje isEmpty, first i map dzięki rozszerzeniom protokołów.
extension Collection {
// isEmpty, first, map, filter, ... są tutaj zdefiniowane tylko raz
// a każda tablica, zbiór, słownik i ciąg znaków z nich korzysta
}Ograniczone rozszerzenie dodaje metody tylko dla niektórych typów spełniających wymagania, zapisane za pomocą where:
protocol Container {
associatedtype Item
var items: [Item] { get }
}
extension Container where Item == Int {
var sum: Int { items.reduce(0, +) }
}
struct Box: Container {
var items: [Int]
}
print(Box(items: [2, 5]).sum)Wynik:
7Wyzwanie
ŁatwyZadeklaruj protokół Priced, który wymaga var price: Int { get } (w centach) oraz var formatted: String { get }. W rozszerzeniu protokołu przypisz formatted wartość domyślną, która zwraca $4.50, i dodaj metodę isAffordable(budget:), która zwraca informację, czy cena mieści się w budżecie. Niech struktury Coffee (cena 450) i Sandwich (z przechowywaną zmienną price) będą zgodne z protokołem. Coffee musi zastąpić domyślne formatted wartością coffee $4.50.
Udostępniony kod odczytuje budżet, a następnie wiersze coffee lub sandwich,650. Dla każdego produktu wypisuje formatted oraz yes albo no.
Twój kod umieść w plikach Priced.swift, Coffee.swift i Sandwich.swift. Plik main.swift zawiera udostępniony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
var input: [String] = []
while let line = readLine() { input.append(line) }
let budget = Int(input[0])!
for line in input.dropFirst() {
let item: any Priced = line == "coffee" ? Coffee() : Sandwich(price: Int(line.split(separator: ",")[1])!)
print("\(item.formatted) \(item.isAffordable(budget: budget) ? "yes" : "no")")
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Właściwości w szczegółach
Właściwości obliczaneObserwatory właściwościElementy statyczneTypy wyliczeniowe z metodamiPodsumowanie – rejestr temperatury6Protokoły
Definiowanie protokołówTypy zgodneRozszerzenia protokołówProtokoły jako typyPodsumowanie – system płatnościPoćwicz samodzielnie: Edytor online Swift