Zwracanie domknięć
Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 41 z 56.
Widziałeś, jak makeCounter zwraca domknięcie. Ta sama sztuczka pozwala tworzyć konfigurowalne zachowanie: raz przekazujesz parametry, a otrzymujesz funkcję, która używa ich wiele razy.
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4)) // 12
print(tenfold(4)) // 40Zwrócona funkcja domknięta przechwytuje k, więc każde wywołanie multiplier(...) tworzy zupełnie nową funkcję domkniętą z własnym k.
Ten wzorzec stanowi podstawę kodu „strategii” w Swift: napisz funkcję, która przyjmuje konfigurację i zwraca domknięcie, a następnie przekaż to domknięcie do map, filter, sorted(by:) lub w dowolne inne miejsce, w którym oczekiwana jest wartość będąca funkcją.
Wyzwanie
ŚredniZbuduj dwie fabryki domknięć:
greaterThan(_ k: Int) -> (Int) -> Bool: zwraca predykat, który ma wartośćtrue, gdy jego argument jest ściśle większy niżkscaleBy(_ k: Int) -> (Int) -> Int: zwraca funkcję, która mnoży swój argument przezk
Odczytaj trzy wiersze:
- Liczba całkowita
threshold - Liczba całkowita
scale - Rozdzielona przecinkami lista liczb całkowitych, czyli
nums
Wypisz trzy wiersze:
- Liczby większe od progu (przefiltruj za pomocą domknięcia z
greaterThan), połączone za pomocą, - Te same liczby po przeskalowaniu (przekształć za pomocą
scaleBy), połączone za pomocą, - Ile liczb przeszło przez filtr
Dla danych wejściowych 5 / 3 / 2,7,3,8,9 wynikiem jest:
7,8,9
21,24,27
3Spróbuj swoich sił
let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: greaterThan, scaleBy; najpierw filter, potem map; wypisz połączone wartości i ich liczbę
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łówPoćwicz samodzielnie: Edytor online Swift