Section 1/81 menit
1. Masalah yang Dipecahkan
1. Masalah yang Dipecahkan
Masalah: Variadic Generics yang Tidak Ekspresif
Sebelum Swift 5.9, jika kamu ingin menulis fungsi yang menerima beberapa argumen dengan tipe berbeda, kamu punya beberapa pilihan buruk:
Pilihan 1: Overloading manual — tidak skalabel
swift
// Harus tulis versi untuk setiap jumlah argumen
func zip<A, B>(_ a: A, _ b: B) -> (A, B) { (a, b) }
func zip<A, B, C>(_ a: A, _ b: B, _ c: C) -> (A, B, C) { (a, b, c) }
func zip<A, B, C, D>(_ a: A, _ b: B, _ c: C, _ d: D) -> (A, B, C, D) { (a, b, c, d) }
// ... terus sampai berapa? 5? 10? 20?
// Swift standard library punya versi hingga 6 argumen untuk beberapa fungsi
Pilihan 2: Any atau existential — kehilangan type safety
swift
func process(_ values: Any...) {
for value in values {
// Harus cast manual — kehilangan type information
if let int = value as? Int { handleInt(int) }
else if let string = value as? String { handleString(string) }
// ...
}
}
Pilihan 3: Tuple — tidak fleksibel
swift
// Hanya bisa tuple dengan jumlah elemen fixed
func process<A, B>(_ pair: (A, B)) { }
// Tidak bisa generic terhadap jumlah elemen
Apa yang diinginkan:
swift
// Ideanya: fungsi yang menerima "berapapun" argumen dengan tipe berbeda
// dan melakukan operasi type-safe pada masing-masing
func validate<each T>(_ values: repeat each T, using validators: repeat Validator<each T>) -> Bool