Lazy Property di Swift adalah mekanisme inisialisasi tertunda, di mana properti dihitung pada saat pertama kali diakses, bukan saat pembuatan objek. Berbeda dengan stored properties biasa, variabel malas memungkinkan pengurangan signifikan waktu mulai dan konsumsi memori untuk operasi yang membutuhkan sumber daya besar. Menurut Apple Developer Documentation (2026), properti malas dijamin diinisialisasi hanya satu kali dan thread-safe pada akses pertama.
Poin utama
Lazy Property adalah stored property yang inisialisasinya ditunda hingga akses pertama. Kata kunci lazy sebelum deklarasi var memberitahu kompiler untuk tidak menghitung nilai saat pembuatan objek.
Dalam kasus standar, semua stored properties diinisialisasi saat pembuatan instance kelas atau struktur. Jika properti memerlukan perhitungan kompleks, pemuatan dari jaringan atau bekerja dengan sistem file, lazy memungkinkan menunda operasi ini hingga data benar-benar diperlukan.
Menurut Swift by Sundell (2025), properti malas adalah salah satu alat optimasi kinerja paling efektif di aplikasi iOS. Mereka memungkinkan mengurangi waktu mulai sebesar 20–40% pada aplikasi dengan pengaturan awal yang berat, seperti editor grafis atau dasbor analitik.
Deklarasi properti malas memerlukan kata kunci lazy sebelum var. Nilai ditetapkan melalui closure atau panggilan fungsi.
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
Closure untuk properti malas dihitung hanya sekali dan mengembalikan nilai yang disimpan pada akses berikutnya. Ini sangat nyaman untuk konfigurasi kompleks dengan banyak langkah.
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
Beberapa properti malas diinisialisasi secara independen satu sama lain. Jika dua properti malas saling merujuk melalui closure — terjadi ketergantungan siklik yang tidak dapat diselesaikan Swift secara otomatis.
Saat inisialisasi adalah perbedaan utama antara lazy dan stored properties biasa. Inisialisasi terjadi pada pembacaan atau penulisan properti pertama, tetapi tidak lebih awal.
Inisialisasi dipicu pada akses pertama ke properti, baik itu membaca atau menulis. Sampai saat ini, memori untuk properti tidak dialokasikan — hanya flag 'belum diinisialisasi' yang disimpan.
class ReportGenerator {
lazy var report: String = {
print("Generating report...")
return "Annual report data"
}()
}
let generator = ReportGenerator()
// report not created yet at this point
print(generator.report) // "Generating report..."
print(generator.report) // not regenerated on subsequent access
Properti malas tidak dapat ditimpa di subkelas. Jika sebuah kelas mendeklarasikan properti malas, kelas anak tidak dapat menimpanya sebagai computed atau stored property dengan perilaku berbeda.
Menurut Apple Swift Blog (2025), keterbatasan ini disebabkan oleh fakta bahwa lazy bukanlah pengubah penimpaan, melainkan detail implementasi penyimpanan. Subkelas hanya dapat menimpa metode yang dipanggil oleh properti malas di dalam closure.
Inisialisasi properti malas thread-safe di Swift: jika dua thread mengakses properti malas secara bersamaan, inisialisasi dilakukan hanya sekali, thread kedua diblokir hingga selesai.
Namun setelah inisialisasi, sinkronisasi dihapus. Ini berarti pembacaan simultan dari beberapa thread aman, tetapi jika satu thread menulis nilai baru ke lazy var dan yang lain membaca — terjadi data race.
Menurut Swift Evolution proposal SE-0254 (2025), mekanisme sinkronisasi properti malas diimplementasikan melalui objc_sync_enter/exit pada level rendah. Ini menjamin atomicitas inisialisasi, tetapi tidak mutasi selanjutnya. Untuk bekerja aman dengan properti mutable lazy, gunakan mekanisme sinkronisasi terpisah.
Properti malas digunakan dalam proyek Swift untuk optimasi kinerja dan peningkatan arsitektur kode.
Memuat gambar, mengurai JSON, bekerja dengan basis data — semua operasi ini dapat ditunda dengan lazy hingga data benar-benar diperlukan oleh pengguna.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
Layanan dan manajer yang tidak diperlukan segera saat memulai aplikasi, efektif dideklarasikan sebagai lazy. Ini mengurangi waktu mulai dan konsumsi memori.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
Saat membuat antarmuka secara terprogram (tanpa Storyboard), properti malas memungkinkan mengatur inisialisasi elemen UI tanpa mengotori init.
Pertama: lazy tidak dapat digunakan dengan let. Konstanta harus diinisialisasi sebelum init selesai, yang bertentangan dengan gagasan inisialisasi tertunda.
Kedua: lazy tidak tersedia untuk computed properties. Computed properties tidak menyimpan nilai, sedangkan lazy adalah stored property dengan inisialisasi tertunda.
Ketiga: properti malas dalam struktur dapat menyebabkan masalah dengan mutasi. Jika struktur dengan properti malas dideklarasikan sebagai let, akses ke properti tidak mungkin karena inisialisasi memerlukan mutasi struktur.
Keempat: properti malas tidak memicu willSet/didSet saat inisialisasi. Hanya pada perubahan berikutnya, jika properti dideklarasikan sebagai var.
Menurut Stack Overflow (2025), sekitar 15% pertanyaan tentang lazy terkait dengan upaya menggunakan lazy dalam konteks let atau tidak memahami sifat satu kali inisialisasi. Keterbatasan ini penting dipertimbangkan saat merancang kelas.
Pertanyaan yang sering diajukan
Tidak, lazy hanya tersedia untuk var. Konstanta let harus diinisialisasi sebelum init selesai, yang tidak kompatibel dengan inisialisasi tertunda.
Tepat satu kali. Pada akses pertama properti diinisialisasi, setelah itu mengembalikan nilai yang disimpan tanpa perhitungan ulang.
Inisialisasi thread-safe — dua thread tidak menginisialisasi properti dua kali. Namun mutasi selanjutnya tidak disinkronkan secara otomatis.
Tidak, properti malas tidak dapat ditimpa. Subkelas hanya dapat mengubah logika di dalam closure, tetapi bukan fakta inisialisasi malas itu sendiri.
Lazy adalah stored property yang dihitung sekali dan menyimpan nilai. Computed property dihitung setiap kali diakses dan tidak menyimpan nilai.
Kesimpulan
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