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.