Funkcje generyczne
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 34 z 57.
Funkcja generyczna działa z dowolnym typem. Symbol zastępczy w nawiasach ostrych, często T, oznacza typ używany przez wywołującego, a Swift uzupełnia go przy każdym wywołaniu:
func firstAndLast<T>(_ items: [T]) -> [T] {
guard let first = items.first, let last = items.last else { return [] }
return [first, last]
}
print(firstAndLast([3, 8, 1]))
print(firstAndLast(["a", "b", "c"]))Wynik:
[3, 1]
["a", "c"]Wewnątrz funkcji nic nie wiadomo o T, więc dozwolone są tylko operacje działające dla każdego typu. Ograniczenie, takie jak T: Comparable, pozwala na więcej; tutaj umożliwia użycie operatora <:
func largest<T: Comparable>(_ items: [T]) -> T? {
guard var best = items.first else { return nil }
for item in items where item > best { best = item }
return best
}
print(largest([4, 9, 2])!)
print(largest(["pear", "apple", "zucchini"])!)Wynik:
9
zucchiniTypy generyczne zachowują dokładny typ, w przeciwieństwie do Any. Wynikiem wywołania largest na [Int] jest Int?, więc można go użyć w działaniach arytmetycznych bez rzutowania:
func largest<T: Comparable>(_ items: [T]) -> T? {
items.max()
}
let top = largest([3, 7, 5]) ?? 0
print(top * 10)Wynik:
70Funkcja może mieć kilka symboli zastępczych, a ograniczenia mogą określać protokoły zdefiniowane przez ciebie:
protocol Scored { var score: Int { get } }
struct Player: Scored { let name: String; let score: Int }
struct Team: Scored { let score: Int }
func total<T: Scored>(_ items: [T]) -> Int {
items.reduce(0) { $0 + $1.score }
}
func pair<A, B>(_ a: A, _ b: B) -> String { "\(a) & \(b)" }
print(total([Player(name: "a", score: 3), Player(name: "b", score: 4)]))
print(total([Team(score: 10)]))
print(pair(1, "one"))Wynik:
7
10
1 & oneWyzwanie
ŁatwyNapisz funkcję generyczną countWhere(_:_:), która przyjmuje tablicę dowolnego typu i predykat (T) -> Bool, a następnie zwraca liczbę elementów spełniających predykat, oraz funkcję mostCommon(_:), która przyjmuje tablicę elementów dowolnego typu Hashable i zwraca jej najczęściej występujący element (ten, który pojawia się jako pierwszy w tablicy, gdy liczby wystąpień są równe) lub nil dla pustej tablicy.
Dostarczony kod odczytuje wiersz ze słowami oddzielonymi przecinkami oraz wiersz z liczbami. Wypisuje liczbę słów dłuższych niż 3 znaki, najczęściej występujące słowo, liczbę parzystych liczb oraz najczęściej występującą liczbę.
Twój kod umieść w pliku Functions.swift. main.swift zawiera dostarczony 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 words = input[0].split(separator: ",").map(String.init)
let numbers = input[1].split(separator: ",").map { Int($0)! }
print(countWhere(words) { $0.count > 3 })
print(mostCommon(words) ?? "none")
print(countWhere(numbers) { $0 % 2 == 0 })
print(mostCommon(numbers).map { String($0) } ?? "none")
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ążekPoćwicz samodzielnie: Edytor online Swift