Lazy Property Swift-da kechiktirilgan inicializatsiya mexanizmi bo'lib, bunda xususiyat ob'ekt yaratilish vaqtida emas, balki unga birinchi murojaat qilingan paytda hisoblanadi. Oddiy stored properties-dan farqli o'laroq, dangasa o'zgaruvchilar resurs talab qiladigan operatsiyalar uchun ishga tushirish vaqtini va xotira sarfini sezilarli darajada kamaytirish imkonini beradi. Apple Developer Documentation (2026) ga ko'ra, dangasa xususiyatlar faqat bir marta inicializatsiya qilinadi va birinchi kirishda thread-safe hisoblanadi.
Asosiy fikrlar
Lazy Property — inicializatsiyasi birinchi murojaatgacha kechiktirilgan stored property. lazy kalit so'zi var deklaratsiyasidan oldin kompilyatorga ob'ekt yaratilish vaqtida qiymatni hisoblamaslikni bildiradi.
Standart holatda barcha stored properties sinf yoki strukturaning namunasi yaratilish vaqtida inicializatsiya qilinadi. Agar xususiyat murakkab hisob-kitoblar, tarmoqdan yuklash yoki fayl tizimi bilan ishlashni talab qilsa, lazy bu operatsiyani ma'lumotlar haqiqatan ham kerak bo'lgunga qadar kechiktirishga imkon beradi.
Swift by Sundell (2025) ga ko'ra, dangasa xususiyatlar iOS ilovalarida ishlash samaradorligini optimallashtirishning eng samarali vositalaridan biridir. Ular og'ir boshlang'ich sozlamalari bo'lgan ilovalarda, masalan, grafik muharrirlar yoki analitik panellarda ishga tushirish vaqtini 20–40% kamaytirishga imkon beradi.
Deklaratsiya dangasa xususiyat lazy kalit so'zining var dan oldin yozilishini talab qiladi. Qiymat closure yoki funksiya chaqiruvi orqali o'rnatiladi.
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
Closure dangasa xususiyat uchun faqat bir marta hisoblanadi va keyingi murojaatlarda saqlangan qiymatni qaytaradi. Bu ko'p bosqichli murakkab konfiguratsiya uchun ayniqsa qulaydir.
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
Bir nechta dangasa xususiyatlar bir-biridan mustaqil ravishda inicializatsiya qilinadi. Ikki dangasa xususiyat closure-lar orqali bir-biriga murojaat qilsa — Swift avtomatik hal qila olmaydigan tsiklik bog'liqlik yuzaga keladi.
Inicializatsiya vaqti — lazy ni oddiy stored properties dan ajratib turuvchi asosiy farqdir. Inicializatsiya xususiyatning birinchi o'qilishi yoki yozilishida sodir bo'ladi, lekin undan oldin emas.
Inicializatsiya xususiyatga birinchi murojaatda ishga tushadi, xoh o'qish, xoh yozish bo'lsin. Shu paytgacha xususiyat uchun xotira ajratilmaydi — faqat «inicializatsiya qilinmagan» bayrog'i saqlanadi.
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
Dangasa xususiyatlar pastki sinflarda override qilinmaydi. Agar sinf dangasa xususiyat e'lon qilsa, pastki sinf uni computed yoki stored property sifatida boshqa xatti-harakat bilan almashtira olmaydi.
Apple Swift Blog (2025) ga ko'ra, bu cheklov lazy ning override modifikatori emas, balki xotira saqlashning amalga oshirish detali ekanligi bilan bog'liq. Pastki sinf faqat dangasa xususiyat closure-da chaqiradigan metodni override qilishi mumkin.
Inicializatsiya dangasa xususiyatning Swift-da thread xavfsiz: ikki thread bir vaqtning o'zida dangasa xususiyatga murojaat qilsa, inicializatsiya faqat bir marta amalga oshiriladi, ikkinchi thread uning tugashini kutadi.
Biroq inicializatsiyadan so'ng sinxronizatsiya olib tashlanadi. Bu shuni anglatadiki, bir nechta thread-lardan bir vaqtda o'qish xavfsiz, ammo bir thread lazy var ga yangi qiymat yozsa, ikkinchisi o'qisa — data race yuzaga keladi.
Swift Evolution proposal SE-0254 (2025) ga ko'ra, dangasa xususiyatlarning sinxronizatsiya mexanizmi past darajada objc_sync_enter/exit orqali amalga oshiriladi. Bu inicializatsiyaning atomarligini kafolatlaydi, ammo keyingi mutatsiyalarni emas. O'zgaruvchan dangasa xususiyatlar bilan xavfsiz ishlash uchun alohida sinxronizatsiya mexanizmlaridan foydalaning.
Dangasa xususiyatlar Swift loyihalarida ishlash samaradorligini optimallashtirish va kod arxitekturasini yaxshilash uchun qo'llaniladi.
Tasvirlarni yuklash, JSON ni parse qilish, ma'lumotlar bazalari bilan ishlash — bu operatsiyalarning barchasi lazy yordamida ma'lumotlar haqiqatan ham foydalanuvchiga kerak bo'lgunga qadar kechiktirilishi mumkin.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
Xizmatlar va menejerlar ilova ishga tushganda darhol kerak bo'lmasa, ularni lazy deb e'lon qilish samaralidir. Bu ishga tushirish vaqtini va xotira sarfini kamaytiradi.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
Interfeysni dasturiy ravishda yaratishda (Storyboard holda) dangasa xususiyatlar UI elementlarining inicializatsiyasini init ni yuklamasdan tashkil etish imkonini beradi.
Birinchi cheklov: lazy let bilan ishlatilmaydi. Konstanta init tugashidan oldin inicializatsiya qilinishi kerak, bu kechiktirilgan inicializatsiya g'oyasiga ziddir.
Ikkinchi cheklov: lazy computed properties uchun mavjud emas. Computed properties qiymat saqlamaydi, lazy esa aynan kechiktirilgan inicializatsiyaga ega stored property.
Uchinchi cheklov: strukturalardagi dangasa xususiyatlar mutatsiya bilan bog'liq muammolarni keltirib chiqarishi mumkin. Agar dangasa xususiyatga ega struktura let deb e'lon qilinsa, xususiyatga kirish imkonsiz, chunki inicializatsiya strukturaning mutatsiyasini talab qiladi.
To'rtinchi: dangasa xususiyatlar inicializatsiya vaqtida willSet/didSet ni chaqirmaydi. Faqat keyingi o'zgarishlarda, agar xususiyat var deb e'lon qilingan bo'lsa.
Stack Overflow (2025) ga ko'ra, lazy bilan bog'liq savollarning taxminan 15% lazy ni let kontekstida ishlatish yoki inicializatsiyaning bir martaligini tushunmaslik bilan bog'liq. Ushbu cheklovlar sinflarni loyihalashda hisobga olinishi muhim.
Ko'p beriladigan savollar
Yo'q, lazy faqat var uchun mavjud. let konstantalari init tugashidan oldin inicializatsiya qilinishi kerak, bu kechiktirilgan inicializatsiya bilan mos kelmaydi.
Aniq bir marta. Birinchi murojaatda xususiyat inicializatsiya qilinadi, shundan so'ng qayta hisoblanmasdan saqlangan qiymatni qaytaradi.
Inicializatsiya thread xavfsiz — ikki thread xususiyatni ikki marta inicializatsiya qilmaydi. Biroq keyingi mutatsiyalar avtomatik sinxronlashtirilmaydi.
Yo'q, dangasa xususiyatlar override qilinmaydi. Pastki sinf faqat closure ichidagi mantiqni o'zgartirishi mumkin, ammo dangasa inicializatsiyaning o'zini emas.
Lazy bir marta hisoblanadigan va qiymat saqlaydigan stored property. Computed property har murojaatda hisoblanadi va qiymat saqlamaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.