Tworzenie potoków
Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 31 z 56.
Metody, które poznałeś: map, filter, reduce, compactMap, flatMap, sorted(by:), to codzienny zestaw narzędzi Swift. W prawdziwym kodzie łączy się je ze sobą.
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]Odczytaj łańcuch od góry do dołu: zachowaj niepuste zamówienia, posortuj je malejąco według ilości, a następnie zachowaj tylko nazwy.
Potoki działają najlepiej, gdy każdy krok ma jeden cel. Jeśli zauważysz, że w domknięciu robisz jednocześnie dwie rzeczy (mapowanie i filtrowanie), podziel je na dwa kroki. Łańcuch pozostaje czytelny, nawet gdy się rozrasta.
Wyzwanie
ŚredniOdczytaj jeden wiersz wejścia: listę elementów name:price:qty oddzielonych przecinkami. Niektóre elementy są nieprawidłowe i należy je pominąć: każdy element, którego cena lub ilość nie jest prawidłową liczbą całkowitą.
Zbuduj potok, który tworzy po jednym wierszu dla każdego prawidłowego elementu z qty > 0, posortowanego malejąco według sumy (price * qty), w formacie:
<name>: <total>Po wierszach z poszczególnymi elementami wypisz jeden wiersz podsumowania: Sum: <n> z łączną sumą.
Dla wejścia apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7 wynikiem jest:
milk: 20
salt: 14
apple: 6
Sum: 40Spróbuj swoich sił
let entries = readLine()!.components(separatedBy: ",")
// TODO: przetwarzanie potokowe z użyciem compactMap (parsowanie), filter (qty > 0),
// sorted (total malejąco), map (formatowanie); wypisz wiersze + Sum
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Dogłębnie o ciągach znaków
Liczba i indeksyWielkość liter i usuwanie białych znakówWyszukiwanie w ciągach znakówDzielenie i łączenieZastępowanie podciągówPodsumowanie — sprawdzanie nazwy użytkownika4Zbiory
Tworzenie zbiorówSuma i część wspólnaRóżnica i różnica symetrycznaPodzbiór i nadzbiórPowtórka — filtr tagów7Projekt – Śledzenie nawyków
Przegląd projektuOznacz jako wykonane10Projekt — silnik quizów
Przegląd projektuZadawanie pytań2Zakresy i kroki
Zakresy domknięte i półotwarteKrokMetody zakresówZakresy w instrukcji switchPowtórka — siatka kalendarza5Funkcje wyższego rzędu, część 1
MapFilterReduceŁączenie map, filter i reducePodsumowanie – statystyki słów3Słowniki
Deklarowanie słownikówWyszukiwanie opcjonalneAktualizowanie słownikówIterowanie po słownikachGrupowanie wartościPodsumowanie – inwentarz6Funkcje wyższego rzędu, cz. 2
compactMapflatMapsorted(by:)Tworzenie potokówPowtórzenie – tabela wynikówPoćwicz samodzielnie: Edytor online Swift