Section 2/81 menit

2. Teori: Parameter Packs dan Value Packs

2. Teori: Parameter Packs dan Value Packs

Apa itu Pack?

Pack adalah kumpulan tipe atau nilai yang diproses bersama-sama. Bayangkan ini seperti tuple yang bisa punya panjang arbiter, dengan semua tipe tersimpan di level compile-time.

swift
Normal generics:    func foo<T>(_ value: T)
                               T adalah SATU tipe

Parameter packs:    func foo<each T>(_ values: repeat each T)
                              ───── T adalah KUMPULAN tipe (pack)
                                          ───────────── repeat: expand pack

Dua Jenis Pack

Type Pack — kumpulan tipe:

swift
// each T adalah type pack: bisa (Int), (Int, String), (Int, String, Bool), dll
func example<each T>(...) { }

Value Pack — kumpulan nilai yang tipe-tipenya didefinisikan oleh type pack:

swift
// repeat each value adalah value pack: satu nilai untuk setiap T dalam type pack
func example<each T>(_ values: repeat each T) { }

Pack Expansion

repeat each X adalah pack expansion — operasi yang "membuka" pack dan menerapkan sesuatu untuk setiap elemen:

swift
// Type-level expansion:
(repeat each T)        // expand type pack T menjadi tuple
                       // (T₁, T₂, T₃, ...) jika T = (T₁, T₂, T₃)

// Value-level expansion:
repeat someFunc(each value)  // panggil someFunc untuk setiap value dalam pack

Compile-Time Unrolling

Penting untuk dipahami: parameter packs di-resolve sepenuhnya di compile time. Tidak ada overhead runtime untuk "iterasi" — compiler men-generate kode untuk setiap elemen secara terpisah:

swift
func printAll<each T>(_ values: repeat each T) {
    repeat print(each values)
}

// Ketika dipanggil dengan (1, "hello", true):
// Compiler generate code setara dengan:
// print(1)
// print("hello")
// print(true)

Ini seperti template metaprogramming di C++, tapi dengan syntax yang jauh lebih bersih.