Swift-da Lazy Property: bu nima, dangasa inicializatsiya sintaksisi

Muallif: IT Sectr Nashr etilgan: 2026-06-20 O'qish vaqti: 10 daq

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 — xususiyat ob'ekt yaratilish vaqtida emas, birinchi murojaatda inicializatsiya qilinadi
  • Faqat var — lazy let uchun taqiqlangan, chunki konstanta inicializatsiyadan oldin ma'lum bo'lishi kerak
  • Thread xavfsizligi — dangasa xususiyatning inicializatsiyasi sinxronlashtirilgan, ammo qayta kirish — yo'q
  • Bir martalik — lazy aniq bir marta hisoblanadi, keyingi murojaatlar saqlangan qiymatni qaytaradi
  • Optimizatsiya — kam ishlatiladigan ma'lumotlar uchun ishga tushirish vaqtini va xotira sarfini kamaytiradi

Swift-da Lazy Property nima?

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.

Dangasa xususiyatning sintaksisi

Deklaratsiya dangasa xususiyat lazy kalit so'zining var dan oldin yozilishini talab qiladi. Qiymat closure yoki funksiya chaqiruvi orqali o'rnatiladi.

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

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

Dangasa xususiyat qachon inicializatsiya qilinadi

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.

Birinchi kirish (o'qish yoki yozish)

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.

swift
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

Meros olishdagi xatti-harakat

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.

Dangasa xususiyatlarning thread xavfsizligi

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.

Amaliy foydalanish stsenariylari

Dangasa xususiyatlar Swift loyihalarida ishlash samaradorligini optimallashtirish va kod arxitekturasini yaxshilash uchun qo'llaniladi.

Og'ir resurslar

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.

swift
class ProfileViewController {
    lazy var avatarImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        return imageView
    }()
}

Singleton bog'liqliklar

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.

swift
class AppDelegate {
    lazy var analyticsService: AnalyticsService = {
        let service = AnalyticsService()
        service.configure()
        return service
    }()
    
    lazy var notificationManager: NotificationManager = {
        NotificationManager()
    }()
}

Kod bilan UI komponentlari

Interfeysni dasturiy ravishda yaratishda (Storyboard holda) dangasa xususiyatlar UI elementlarining inicializatsiyasini init ni yuklamasdan tashkil etish imkonini beradi.

Cheklovlar va tuzoqlar

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

Lazy ni let bilan ishlatish mumkinmi?

Yo'q, lazy faqat var uchun mavjud. let konstantalari init tugashidan oldin inicializatsiya qilinishi kerak, bu kechiktirilgan inicializatsiya bilan mos kelmaydi.

Dangasa xususiyat necha marta hisoblanadi?

Aniq bir marta. Birinchi murojaatda xususiyat inicializatsiya qilinadi, shundan so'ng qayta hisoblanmasdan saqlangan qiymatni qaytaradi.

Dangasa xususiyat ko'p threadli muhitda xavfsizmi?

Inicializatsiya thread xavfsiz — ikki thread xususiyatni ikki marta inicializatsiya qilmaydi. Biroq keyingi mutatsiyalar avtomatik sinxronlashtirilmaydi.

Dangasa xususiyatni pastki sinfda override qilish mumkinmi?

Yo'q, dangasa xususiyatlar override qilinmaydi. Pastki sinf faqat closure ichidagi mantiqni o'zgartirishi mumkin, ammo dangasa inicializatsiyaning o'zini emas.

Lazy ning computed property dan farqi nimada?

Lazy bir marta hisoblanadigan va qiymat saqlaydigan stored property. Computed property har murojaatda hisoblanadi va qiymat saqlamaydi.

Xulosa

  • Lazy Property — birinchi kirishda amalga oshiriladigan kechiktirilgan inicializatsiya mexanizmi
  • Faqat var — lazy let bilan mos kelmaydi, chunki konstanta darhol inicializatsiya talab qiladi
  • Bir martalik — inicializatsiya bir marta amalga oshiriladi, keyingi murojaatlar kesh qilingan qiymatdan foydalanadi
  • Thread xavfsizligi — inicializatsiya sinxronlashtirilgan, ammo inicializatsiyadan keyingi mutatsiyalar alohida sinxronizatsiya talab qiladi
  • Qo'llanilishi — og'ir resurslar, UI komponentlari, singleton xizmatlar, konfiguratsiyalar
  • Cheklovlar — let da, computed properties da, override da va let instansiyali strukturalarda mumkin emas
  • Optimizatsiya — kam ishlatiladigan xususiyatlar uchun ishga tushirish vaqtini va xotira sarfini kamaytiradi

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.

Loyihani muhokama qilish

Shuningdek o'qing