Własne funkcje wyższego rzędu
Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 42 z 56.
Teraz możesz pisać własne funkcje wyższego rzędu, które będą pasować do map i filter. Schemat jest zawsze taki sam: przyjmij parametr będący domknięciem, wywołaj go wewnątrz pętli i zwróć wynik.
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
for item in self {
result.append(transform(item))
}
return result
}
}
[1, 2, 3].myMap { $0 * 10 } // [10, 20, 30]Jeśli rozszerzenia wydają się zbyt skomplikowane, napisz zamiast tego zwykłą funkcję — pomysł jest taki sam:
func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
var n = 0
for item in items where predicate(item) {
n += 1
}
return n
}Gdy możesz przekazywać domknięcia, biblioteka standardowa przestaje wyglądać jak magia, a zaczyna przypominać zestaw wzorców, które możesz napisać samodzielnie.
Wyzwanie
ŚredniNapisz funkcję globalną partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]), która przechodzi przez tablicę jeden raz i zwraca krotkę (matched, rest): elementy, które spełniły predykat, oraz pozostałe, obie listy w oryginalnej kolejności.
Wczytaj dwa wiersze: liczbę całkowitą min, a następnie listę liczb całkowitych oddzielonych przecinkami. Użyj funkcji partition z predykatem, który sprawdza n > min. Wypisz:
matched: <...>rest: <...>
Połącz elementy każdej listy za pomocą , (lub wypisz pusty tekst, jeśli nie ma nic do wypisania).
Dla danych wejściowych 5 / 2,7,3,8,5 wynik to:
matched: 7,8
rest: 2,3,5Spróbuj swoich sił
let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: partition(_:by:) -> ([Int], [Int]); wypisz pasujące elementy i pozostałe
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łów8Domknięcia
Podstawy domknięćDomknięcia końcowePrzechwytywanie wartościZwracanie domknięćWłasne funkcje wyższego rzęduPodsumowanie – konstruktor potokówPoćwicz samodzielnie: Edytor online Swift