Associated Values — mekanisme Swift yang memungkinkan untuk menghubungkan data arbitrer ke setiap varian enum secara individual. Tidak seperti raw values, di mana semua case memiliki nilai dengan tipe yang sama, associated values dapat berbeda dalam tipe dan jumlah untuk setiap case. Menurut Apple Documentation, 2026, ini adalah kemampuan kunci untuk memodelkan domain secara akurat tanpa membuat tipe pembungkus tambahan.
Poin utama
Associated Values — adalah informasi tambahan yang dapat disimpan oleh case enum bersama dengan dirinya sendiri. Tidak seperti raw values yang tetap pada tingkat deklarasi, associated values ditentukan saat pembuatan instance enum.
Bayangkan memodelkan metode pembayaran: case creditCard dapat menyimpan 4 digit terakhir dan tanggal kedaluwarsa, dan case applePay — tidak ada. Dengan associated values ini diimplementasikan secara alami, tanpa subkelas atau bidang opsional.
Menurut dokumentasi Apple, associated values mengubah enum dari kumpulan konstanta sederhana menjadi tipe data aljabar (sum type), yang khas untuk bahasa fungsional. Ini secara signifikan meningkatkan ekspresivitas kode.
Associated values dideklarasikan dalam tanda kurung setelah case, dengan menyebutkan nama dan tipe parameter, seperti pada fungsi.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
Saat pembuatan instance, associated values diteruskan sebagai argumen:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift tidak memberlakukan batasan pada jumlah atau tipe associated values. Anda dapat menggunakan generics, fungsi closure, dan enum lain di dalam associated values. Ini memungkinkan pembangunan struktur bertingkat yang kompleks.
Nama parameter associated values digunakan sebagai label argumen saat pembuatan instance — ini meningkatkan keterbacaan kode. Saat ekstraksi melalui switch, nama berfungsi sebagai dokumentasi, menjelaskan arti setiap nilai. Pendekatan semacam itu membuat kode mendokumentasikan dirinya sendiri dan mengurangi kemungkinan kesalahan dalam pencocokan data. Ini sangat berharga dalam pengembangan tim aplikasi iOS besar.
Switch — cara utama untuk mengekstrak associated values. Nilai diikat ke konstanta atau variabel melalui let atau var.
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swift mendukung pencocokan parsial — nilai spesifik associated values dapat ditentukan:
switch file {
case .image(let w, let h, "png"):
print("Gambar PNG \(w)x\(h)")
case .image(1920, 1080, _):
print("Gambar Full HD")
default:
break
}
Penggunaan wildcard (_) memungkinkan untuk mengabaikan associated values yang tidak perlu, dan konstanta di case — untuk memeriksa kecocokan dengan nilai tertentu.
Banyak pengembang pemula mengacaukan associated values dengan raw values. Ini adalah mekanisme yang berbeda dengan skenario penerapan yang berbeda.
| Karakteristik | Raw Values | Associated Values |
|---|---|---|
| Tipe data | Satu tipe untuk semua case | Tipe berbeda untuk setiap case |
| Saat penentuan | Saat deklarasi enum | Saat pembuatan instance |
| Kewajiban | Semua case memiliki nilai | Beberapa case bisa tanpa nilai |
| Kompatibilitas | Saling eksklusif — tidak dapat digunakan bersamaan | |
Menurut Swift Evolution, associated values diperkenalkan di Swift 2.0 sebagai bagian dari desain ulang enum. Mereka memberikan pendekatan aljabar untuk tipe, di mana setiap case adalah konstruktor terpisah dengan tanda tangannya sendiri.
Associated values secara aktif digunakan dalam proyek iOS nyata. Mari kita lihat tiga skenario tipikal.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
Dengan associated values, enum menjadi alat yang kuat untuk automata terbatas: setiap case — status, associated values — parameter status tersebut. Kompiler menjamin bahwa semua transisi diproses.
Untuk memeriksa satu case tanpa switch gunakan if case atau guard case. Ini lebih ringkas ketika hanya satu varian yang perlu diproses.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("Permintaan waktu habis setelah \(seconds)s")
}
guard case .httpError(let code, _) = error else {
return
}
print("Kesalahan HTTP dengan kode \(code)")
Pertanyaan yang sering diajukan
Ya, sebuah case mungkin tidak memiliki associated values — misalnya, case unknown. Case seperti itu berperilaku seperti case enum biasa tanpa data tambahan. Ini nyaman untuk status penanda.
Swift tidak menghasilkan Equatable secara otomatis untuk enum dengan associated values (hingga Swift 4.2+). Tambahkan implementasi eksplisit Equatable atau gunakan switch untuk membandingkan setiap case satu per satu.
Ya, associated values dalam indirect enum — teknik standar untuk membangun pohon dan daftar tertaut. Sebuah case dapat berisi associated value dari tipe yang sama dengan tanda indirect.
Associated values aman tipe — setiap case dijamin hanya memiliki datanya sendiri. Dalam struct dengan opsional, setiap instance berisi semua bidang dan pemeriksaan runtime untuk nil diperlukan.
Swift tidak menghasilkan Codable secara otomatis untuk enum dengan associated values. Implementasi manual encode dan decode melalui switch pada case menggunakan custom coding keys diperlukan.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga