Menu
CoddyTech

Mengembalikan Closure

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

Kamu melihat makeCounter mengembalikan closure. Trik yang sama memungkinkanmu membuat perilaku yang dapat dikonfigurasi: gunakan parameter sekali, lalu dapatkan fungsi yang menggunakannya berkali-kali.

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

Closure yang dikembalikan menangkap k, jadi setiap pemanggilan multiplier(...) menghasilkan closure baru dengan k-nya sendiri.

Pola ini adalah inti dari kode "strategi" di Swift: tulis fungsi yang menerima konfigurasi dan mengembalikan closure, lalu teruskan closure itu ke map, filter, sorted(by:), atau ke mana pun nilai berbentuk fungsi diperlukan.

challenge icon

Tantangan

Sedang

Buat dua factory closure:

  • greaterThan(_ k: Int) -> (Int) -> Bool: mengembalikan predikat yang bernilai true saat argumennya lebih besar dari k
  • scaleBy(_ k: Int) -> (Int) -> Int: mengembalikan fungsi yang mengalikan argumennya dengan k

Baca tiga baris:

  1. Sebuah bilangan bulat threshold
  2. Sebuah bilangan bulat scale
  3. List bilangan bulat yang dipisahkan koma, yaitu nums

Cetak tiga baris:

  1. Bilangan yang lebih besar dari threshold, filter dengan closure dari greaterThan, lalu gabungkan dengan ,
  2. Bilangan yang sama, setelah diskalakan dengan map menggunakan scaleBy, lalu gabungkan dengan ,
  3. Jumlah bilangan yang lolos

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

7,8,9
21,24,27
3

Coba sendiri

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

// TODO: greaterThan, scaleBy; filter lalu map; cetak hasil yang digabungkan dan jumlahnya
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