Menu
Coddy logo textTech

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))                 // 40

Zwró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ą.

challenge icon

Wyzwanie

Średni

Zbuduj dwie fabryki domknięć:

  • greaterThan(_ k: Int) -> (Int) -> Bool: zwraca predykat, który ma wartość true, gdy jego argument jest ściśle większy niż k
  • scaleBy(_ k: Int) -> (Int) -> Int: zwraca funkcję, która mnoży swój argument przez k

Odczytaj trzy wiersze:

  1. Liczba całkowita threshold
  2. Liczba całkowita scale
  3. Rozdzielona przecinkami lista liczb całkowitych, czyli nums

Wypisz trzy wiersze:

  1. Liczby większe od progu (przefiltruj za pomocą domknięcia z greaterThan), połączone za pomocą ,
  2. Te same liczby po przeskalowaniu (przekształć za pomocą scaleBy), połączone za pomocą ,
  3. 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
3

Spró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ę
quiz iconSprawdź się

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

Poćwicz samodzielnie: Edytor online Swift