willSet dan didSet di Swift: apa itu, sintaksis dan cara kerja pengamat

Penulis: IT Sectr Diterbitkan: 2026-06-20 Waktu membaca: 9 mnt

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 — dipanggil sebelum menyimpan nilai baru properti
  • didSet — dipanggil setelah menyimpan nilai baru
  • newValue — parameter implisit di willSet, berisi nilai baru
  • oldValue — parameter implisit di didSet, berisi nilai lama
  • Pengamat — tidak bekerja saat inisialisasi dan di dalam init

Apa itu willSet dan didSet di Swift?

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.

Kapan willSet dipanggil

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.

Kapan didSet dipanggil

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.

Sintaksis pengamat properti

Property observers dideklarasikan langsung setelah properti menggunakan kurung kurawal. Sintaksis minimal hanya membutuhkan satu pengamat, tetapi keduanya dapat dideklarasikan.

swift
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.

swift
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.

Bagaimana willSet dan didSet bekerja

Urutan eksekusi ditentukan secara ketat: pertama willSet (nilai lama tersedia), kemudian penetapan, lalu didSet (nilai baru tersedia).

swift
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.

Panggilan bersarang dan rekursi

Perubahan properti di dalam didSet dapat menyebabkan pemanggilan ulang pengamat. Swift tidak memblokir rekursi — programmer harus mengontrolnya sendiri.

swift
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.

Pengamat untuk properti struktur

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.

swift
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

Penerapan pengamat dalam proyek nyata

Pengamat properti digunakan dalam proyek Swift untuk berbagai macam tugas: dari sinkronisasi UI hingga validasi data dan pencatatan.

Validasi nilai

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.

swift
var age: Int = 0 {
    didSet {
        if age < 0 || age > 150 {
            age = oldValue
        }
    }
}

Sinkronisasi UI

Saat properti terkait berubah, elemen antarmuka dapat diperbarui secara otomatis tanpa pemanggilan metode pembaruan terpisah.

swift
var userName: String = "" {
    didSet {
        nameLabel.text = userName
    }
}

Pencatatan perubahan

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.

Perbandingan dengan computed properties

Computed properties menghitung nilai saat itu juga dan tidak memiliki penyimpanan, sedangkan willSet dan didSet bekerja pada stored property dengan nilai aktual.

KarakteristikProperty ObserversComputed Properties
Menyimpan nilaiYaTidak
Menjalankan kode saat perubahanYaTidak
Tipe deklarasivarvar (get/set)
Parameter aksesnewValue, oldValuenewValue (di set)
InisialisasiMemerlukan nilai awalTidak 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 umum saat penggunaan

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

Bisakah willSet digunakan tanpa didSet?

Ya, setiap pengamat bersifat opsional. Anda dapat mendeklarasikan hanya willSet, hanya didSet, atau keduanya sekaligus.

Apakah pengamat bekerja di extension?

Tidak, Swift melarang penambahan willSet dan didSet di extension untuk stored properties. Pengamat hanya dideklarasikan dalam definisi asli tipe.

Apakah pengamat dipanggil saat perubahan properti di dalam init?

Tidak, saat inisialisasi pengamat tidak dipanggil. Ini adalah mekanisme perlindungan yang mencegah efek samping pada tahap konstruksi objek.

Apa perbedaan willSet dengan setter di computed property?

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.

Apa yang terjadi jika properti diubah di dalam didSet?

Pemanggilan ulang didSet akan menyebabkan rekursi. Tanpa kondisi keluar, ini akan menyebabkan stack overflow dan penghentian program secara darurat.

Ringkasan

  • willSet — pengamat yang dieksekusi sebelum perubahan properti, dengan akses ke newValue
  • didSet — pengamat yang dieksekusi setelah perubahan properti, dengan akses ke oldValue
  • Sintaksis — observers dideklarasikan dalam kurung kurawal setelah deklarasi properti
  • Inisialisasi — observers tidak bekerja di dalam init dan saat menetapkan nilai default
  • Penerapan — validasi, sinkronisasi UI, pencatatan, audit perubahan
  • Rekursi — perubahan properti di dalam didSet memerlukan kondisi keluar yang eksplisit
  • Computed — jangan tertukar dengan computed properties: observers mengamati, computed menghitung

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.

Diskusikan proyek

Baca juga