Menu
CoddyTech

Higher-Order Kustom

Termasuk bagian Logika dan Alur dalam perjalanan Swift di Coddy. Pelajaran 42 dari 56.

Sekarang kamu bisa menulis fungsi tingkat tinggi sendiri, dan fungsi tersebut akan cocok digunakan bersama map dan filter. Polanya selalu sama: terima parameter closure, panggil closure di dalam perulangan, lalu kembalikan hasilnya.

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]

Jika extension terasa terlalu rumit, tulis fungsi bebas saja, idenya sama:

func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
    var n = 0
    for item in items where predicate(item) {
        n += 1
    }
    return n
}

Setelah kamu bisa meneruskan closure, standard library tidak lagi tampak seperti sulap, melainkan seperti kumpulan pola yang bisa kamu tulis sendiri.

challenge icon

Tantangan

Sedang

Tulis fungsi bebas partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]) yang menelusuri array sekali dan mengembalikan tuple (matched, rest): elemen yang memenuhi predikat, dan sisanya, keduanya dalam urutan aslinya.

Baca dua baris: sebuah bilangan bulat min, lalu list bilangan bulat yang dipisahkan koma. Gunakan partition dengan predikat yang memeriksa n > min. Cetak:

  1. matched: <...>
  2. rest: <...>

Gabungkan setiap list dengan , (atau biarkan kosong jika tidak ada yang perlu dicetak).

Untuk input 5 / 2,7,3,8,5, output-nya adalah:

matched: 7,8
rest: 2,3,5

Coba sendiri

let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: partition(_:by:) -> ([Int], [Int]); tampilkan yang cocok dan sisanya
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Playground Swift