Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Średni

Napisz 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:

  1. matched: <...>
  2. 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,5

Spró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
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