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.
Tantangan
SedangTulis 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:
matched: <...>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,5Coba sendiri
let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: partition(_:by:) -> ([Int], [Int]); tampilkan yang cocok dan sisanya
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami string
Jumlah dan indeksHuruf besar, huruf kecil, dan hapus spasiMencari dalam stringMemisahkan dan menggabungkanMengganti substringUlasan: Memeriksa nama pengguna4set
Membuat setGabungan dan IrisanSelisih dan Selisih SimetrisHimpunan Bagian dan Himpunan SupersetRingkasan: Filter Tag7Proyek: Pelacak Kebiasaan
Gambaran Umum ProyekTandai Selesai2Rentang dan Langkah
Rentang Tertutup vs Setengah TerbukaLangkahMetode RentangRentang dalam SwitchRangkuman: Kisi Kalender8Closure
Dasar ClosureTrailing ClosureMenangkap NilaiMengembalikan ClosureHigher-Order KustomRangkuman, Pembuat PipelineLatihan sendiri: Playground Swift