Section 5/81 menit

5. Kapan Harus Digunakan

5. Kapan Harus Digunakan

Gunakan Parameter Packs + Pack Iteration ketika:

1. Library function yang harus bekerja dengan beberapa tipe berbeda

swift
// Validation, transformation, atau combination dari beberapa nilai berbeda tipe
func allSatisfy<each T: Validatable>(_ values: repeat each T) -> Bool {
    for value in repeat each values {
        guard value.validate().isValid else { return false }
    }
    return true
}

// Penggunaan:
let isFormValid = allSatisfy(username, email, password, phoneNumber)

2. Type-safe tuple operations

swift
// Map atas tuple dengan tipe berbeda
func mapTuple<each Input, each Output>(
    _ values: repeat each Input,
    transform: (repeat each Input) -> (repeat each Output)
) -> (repeat each Output) {
    transform(repeat each values)
}

3. Menggantikan overloading yang repetitif

swift
// SEBELUM: harus tulis banyak overload
func assertEqual<T: Equatable>(_ a: T, _ b: T) { }
func assertAllEqual<T: Equatable>(_ a: T, _ b: T, _ c: T) { }
func assertAllEqual<T: Equatable>(_ a: T, _ b: T, _ c: T, _ d: T) { }

// SESUDAH: satu fungsi dengan pack
func assertAllEqual<each T: Equatable>(_ pairs: repeat (each T, each T)) {
    for (a, b) in repeat each pairs {
        assert(a == b, "\(a) != \(b)")
    }
}

4. Type-safe dependency injection

swift
// Factory yang menginstansiasi banyak tipe dari pack
func makeAll<each T: Service>(types: repeat (each T).Type) -> (repeat each T) {
    (repeat (each types).init())
}