willSet dan didSet adalah pengamat properti (property observers) di Swift yang memungkinkan eksekusi kode sebelum dan sesudah perubahan nilai properti. Berbeda dengan computed properties, pengamat tidak menghitung nilai baru, hanya bereaksi terhadap perubahan. Menurut dokumentasi Apple, The Swift Programming Language (2026), pengamat sangat diperlukan dalam validasi data, sinkronisasi antarmuka, dan pencatatan perubahan dalam kode.
Poin Utama
willSet dan didSet adalah property observers (pengamat properti) di Swift, mekanisme bawaan untuk melacak perubahan stored properties.
Berbeda dengan bahasa lain yang memerlukan implementasi manual setter atau sistem callback, Swift menyediakan sintaksis deklaratif untuk bereaksi terhadap perubahan. Pengamat ditambahkan langsung setelah deklarasi properti dan tidak memerlukan pemanggilan terpisah.
Menurut Apple Developer Documentation (2026), property observers didukung untuk stored properties dari kelas, struktur, atau enumerasi apa pun. Mereka tidak bekerja dengan computed properties, karena properti tersebut tidak menyimpan nilai — untuk mereka, reaksi terhadap perubahan diimplementasikan langsung di setter.
willSet dipanggil tepat sebelum penetapan nilai baru ke properti. Di dalam willSet tersedia parameter implisit newValue yang berisi nilai yang akan ditetapkan. Pada saat ini nilai properti saat ini belum berubah — Anda dapat membaca nilai lama langsung melalui properti.
Menurut Swift Evolution proposal SE-0001 (2024), willSet memberikan kemampuan untuk melakukan validasi atau pencatatan sebelum perubahan aktual. Jika di willSet dilemparkan pengecualian — nilai baru tidak akan diterapkan, yang menjadikan pengamat sebagai mekanisme perlindungan data.
didSet dipanggil tepat setelah penetapan nilai baru. Di dalam didSet tersedia parameter implisit oldValue yang berisi nilai sebelum perubahan. Pada saat ini properti sudah berisi nilai baru dan Anda dapat membandingkannya dengan nilai lama.
Menurut Swift by Sundell (2025), didSet adalah pengamat paling populer karena paling sering diperlukan untuk pasca-pemrosesan: pembaruan UI, perhitungan ulang bidang dependen, atau pengiriman data ke server setelah perubahan.
Property observers dideklarasikan langsung setelah properti menggunakan kurung kurawal. Sintaksis minimal hanya membutuhkan satu pengamat, tetapi keduanya dapat dideklarasikan.
var score: Int = 0 {
willSet {
print("Skor akan berubah menjadi \(newValue)")
}
didSet {
print("Skor berubah dari \(oldValue) menjadi \(score)")
}
}
Kedua pengamat bersifat opsional — Anda dapat menentukan hanya willSet atau hanya didSet. Untuk willSet, newValue dapat diganti namanya dengan menentukan nama dalam tanda kurung.
var username: String = "guest" {
willSet(newName) {
print("Akan menetapkan \(newName)")
}
didSet(oldName) {
print("Dulu \(oldName), sekarang \(username)")
}
}
Menurut Swift Language Guide (2026), penggantian nama parameter meningkatkan keterbacaan kode, terutama ketika properti dan pengamat digunakan dalam proyek besar dengan nama yang panjang.
Urutan eksekusi ditentukan secara ketat: pertama willSet (nilai lama tersedia), kemudian penetapan, lalu didSet (nilai baru tersedia).
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("Suhu akan berubah dari \(celsius) menjadi \(newValue)")
}
didSet {
if celsius > 100.0 {
print("Titik didih terlampaui!")
}
}
}
}
Batasan penting: pengamat tidak dipanggil saat inisialisasi properti dalam proses pembuatan instance. Di dalam init, penetapan nilai tidak memicu willSet dan didSet — ini mencegah efek samping yang tidak diinginkan pada tahap konstruksi.
Menurut Apple Swift Blog (2025), perilaku ini berbeda dari banyak bahasa lain di mana setter dipanggil bahkan di konstruktor. Swift memilih keamanan: pengamat mulai bekerja hanya setelah inisialisasi objek selesai.
Perubahan properti di dalam didSet dapat menyebabkan pemanggilan ulang pengamat. Swift tidak memblokir rekursi — programmer harus mengontrolnya sendiri.
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
Kode seperti itu akan menciptakan rekursi total dengan stack overflow jika tidak ada kondisi keluar. Menurut Stack Overflow Swift Community (2025), ini adalah salah satu kesalahan paling umum dari programmer pemula saat bekerja dengan property observers.
Struktur mendukung willSet dan didSet untuk stored properties tanpa batasan. Penting untuk diingat bahwa struktur adalah value types, dan modifikasi properti di dalam metode mutating juga memicu pengamat.
struct Point {
var x: Double = 0.0 {
didSet {
print("X berubah menjadi \(x)")
}
}
var y: Double = 0.0 {
didSet {
print("Y berubah menjadi \(y)")
}
}
}
var point = Point()
point.x = 5.0
Pengamat properti digunakan dalam proyek Swift untuk berbagai macam tugas: dari sinkronisasi UI hingga validasi data dan pencatatan.
didSet memungkinkan pembatalan atau koreksi nilai yang tidak valid segera setelah ditetapkan. Ini menggantikan setter yang rumit di Objective-C dan memastikan integritas data di tingkat model.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
Saat properti terkait berubah, elemen antarmuka dapat diperbarui secara otomatis tanpa pemanggilan metode pembaruan terpisah.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet berguna untuk pencatatan dalam rangka debugging atau audit. Anda dapat mencatat waktu dan nilai baru sebelum diterapkan, memastikan bahwa log berisi data asli untuk analisis.
Menurut objc.io (2025), property observers sangat berguna dalam arsitektur dengan aliran data searah, di mana setiap perubahan properti dicatat untuk reproduksi status selanjutnya.
Computed properties menghitung nilai saat itu juga dan tidak memiliki penyimpanan, sedangkan willSet dan didSet bekerja pada stored property dengan nilai aktual.
| Karakteristik | Property Observers | Computed Properties |
|---|---|---|
| Menyimpan nilai | Ya | Tidak |
| Menjalankan kode saat perubahan | Ya | Tidak |
| Tipe deklarasi | var | var (get/set) |
| Parameter akses | newValue, oldValue | newValue (di set) |
| Inisialisasi | Memerlukan nilai awal | Tidak diperlukan |
Perbedaan utama: computed property menghitung nilai setiap kali diakses, sedangkan property observer bereaksi terhadap perubahan nilai yang ada. Pilihan di antara keduanya ditentukan oleh semantik — jika properti merupakan turunan dari data lain, gunakan computed; jika ini adalah nilai independen yang perubahannya perlu diamati, gunakan willSet/didSet.
Kesalahan paling umum — pemanggilan rekursif didSet tanpa kondisi keluar. Setiap perubahan properti di dalam didSet memicu observer lagi, yang menyebabkan loop tak terbatas.
Kesalahan kedua yang umum — mencoba menggunakan pengamat pada properti let. Kompiler Swift akan memberikan kesalahan, karena let adalah konstanta.
Kesalahan ketiga — mengabaikan fakta bahwa observer tidak dipanggil saat inisialisasi. Pengembang yang mengharapkan willSet dipicu di dalam init mendapatkan perilaku yang tidak terduga.
Masalah keempat — menerapkan pengamat ke properti di extension. Swift melarang menambahkan willSet/didSet ke stored properties di extension.
Menurut Ray Wenderlich (2025), memahami batasan ini membantu menghindari bug pada tahap awal dan membuat kode Swift lebih dapat diprediksi.
Pertanyaan yang Sering Diajukan
Ya, setiap pengamat bersifat opsional. Anda dapat mendeklarasikan hanya willSet, hanya didSet, atau keduanya sekaligus.
Tidak, Swift melarang penambahan willSet dan didSet di extension untuk stored properties. Pengamat hanya dideklarasikan dalam definisi asli tipe.
Tidak, saat inisialisasi pengamat tidak dipanggil. Ini adalah mekanisme perlindungan yang mencegah efek samping pada tahap konstruksi objek.
willSet adalah pengamat stored property yang dieksekusi sebelum perubahan nilai. Setter di computed property adalah cara untuk menghitung nilai baru, bukan mengamati nilai yang ada.
Pemanggilan ulang didSet akan menyebabkan rekursi. Tanpa kondisi keluar, ini akan menyebabkan stack overflow dan penghentian program secara darurat.
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