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