@Published — Combine frameworkidagi property wrapper boʻlib, ObservableObject protokoliga mos keladigan sinf xususiyatining oʻzgarishlarini avtomatik nashr qiladi. @Published bilan belgilangan xususiyatning qiymati oʻzgarganda, SwiftUI objectWillChange orqali signal oladi va ushbu obʻektga obuna boʻlgan barcha view-larni qayta chizadi. Apple Combine Framework Documentation (2025) maʻlumotlariga koʻra, @Published Publisher yaratadi, uni qoʻshimcha ravishda Combine operatorlari: map, filter, debounce va boshqalar orqali transformatsiya qilish mumkin. Bu @Published ni MVVM arxitekturasida maʻlumotlar va foydalanuvchi interfeysi oʻrtasidagi asosiy koʻprikka aylantiradi.
Asosiy
objectWillChange chaqiriladi, bu obuna boʻlgan view-larning qayta chizilishiga sabab boʻladi$property proyeksiyasi orqali mavjud — oqimga obuna boʻlish, birlashtirish va transformatsiya qilish mumkin@Published — Combine modulida aniqlangan property wrapper boʻlib, sinf xususiyatiga obunachilarni oʻzgarishlar haqida avtomatik xabardor qilish imkoniyatini qoʻshadi. U faqat sinf ichida (strukturada emas) va faqat ObservableObject protokoliga mos keladigan sinfning xususiyatlariga qoʻllanilishi mumkin.
@Published xususiyatining qiymati oʻzgarganda, Combine ichki publisher orqali hodisa yaratadi, unga dollar prefiksi orqali kirish mumkin: $propertyName. Bu publisher ObservableObjectPublisher dir, u ObservableObject-ning oʻziga tegishli. SwiftUI avtomatik ravishda unga obuna boʻladi, view @ObservedObject yoki @StateObject ishlatganda, va obʻekt ichidagi istalgan @Published xususiyati oʻzgarganda view-ni qayta chizadi.
Matt Neuburgning „IOS 18 Programming Fundamentals with Swift” (2025) kitobiga koʻra, @Published willSet patternining qulay oʻrami boʻlib, avtomatik ravishda objectWillChange.send() ni chaqiradi. Kompilyator @Published ni willSet kuzatuvchisi bilan hisoblangan xususiyatga aylantiradi, bu esa qoʻlda amalga oshirish bilan solishtirganda runtime da nol yuk hosil qiladi.
Oʻzgarishlari interfeysda aks etishi kerak boʻlgan barcha ObservableObject xususiyatlari uchun @Published dan foydalaning. UI ga taʻsir qilmaydigan xususiyatlar uchun @Published siz oddiy stored properties keraksiz qayta chizishlar sonini kamaytiradi.
@Published kompilyatsiya vaqtida ikkita asosiy elementni yaratadi. Birinchisi — yangi qiymat yozilishidan oldin objectWillChange.send() ni chaqiradigan willSet kuzatuvchisiga ega saqlanadigan xususiyat. Ikkinchisi — Published.Publisher ni qaytaradigan $propertyName proyeksiyasi, uni toʻgʻridan-toʻgʻri Combine quvurlarida ishlatish mumkin.
Uch xususiyatga ega Settings sinfini koʻrib chiqaylik: ikkita @Published va bitta oddiy:
class Settings: ObservableObject {
@Published var username: String = "Guest"
@Published var isDarkMode = false
var lastLogin: Date = Date() // @Published siz
}
username yoki isDarkMode oʻzgarganda, SwiftUI Settings nusxasiga obuna boʻlgan barcha view-larni qayta chizadi. lastLogin oʻzgarishi qayta chizishga sabab boʻlmaydi. Agar oddiy xususiyatning oʻzgarishi haqida obunachilarni qoʻlda xabardor qilish kerak boʻlsa, willSet kuzatuvchisida objectWillChange.send() ni chaqirish mumkin.
Muhim tafsilot: @Published oʻzgarishlarni faqat xususiyatga toʻgʻridan-toʻgʻri yozilganda nashr qiladi. Agar xususiyat maʻlumot turi (sinf) boʻlsa va uning ichki holati havolani almashtirmasdan oʻzgarsa, @Published buni sezmaydi. Bunday hollarda hodisani qoʻlda yuborish yoki qiymat turi (struktura) bilan almashtirish kerak.
@Published Combine bilan chambarchas integratsiyalashgan — har bir @Published xususiyati avtomatik ravishda $propertyName proyeksiyasi orqali mavjud publisher taqdim etadi. Bu qiymatlarni filtrlash, transformatsiya qilish, birlashtirish va kechiktirilgan qayta ishlash uchun Combine operatorlarini qoʻllash imkonini beradi.
Oddiy stsenariy — debounce bilan qidirish. Kiritish maydoni @Published searchText xususiyatiga bogʻlangan, ammo serverga soʻrov faqat 300 ms pauzadan keyin yuborilishi kerak. Combine $searchText.debounce bilan buni bir qatorda hal qiladi:
class SearchViewModel: ObservableObject {
@Published var searchText = ""
@Published var results: [String] = []
private var cancellables = Set<AnyCancellable>()
init() {
setupSearchSubscription()
}
private func setupSearchSubscription() {
$searchText
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.removeDuplicates()
.sink { [weak self] text in
self?.performSearch(text)
}
.store(in: &cancellables)
}
private func performSearch(_ text: String) { }
}
John Sundell maqolasiga (Swift by Sundell, 2024) koʻra, @Published ni Combine bilan birlashtirish SwiftUI ilovalarida reaktiv quvurlar uchun standart naqshdir: validation, debounce, throttle, combineLatest, boshqa publisherlar bilan merge. @Published imperativ UI kod va reaktiv Combine oʻrtasida koʻprik vazifasini bajaradi.
iOS 17 chiqishi bilan Apple ObservableObject va @Published siz reaktivlikka muqobil yondashuvni taklif qiluvchi @Observable makrosini taqdim etdi. @Observable xususiyatlarga kirishni yozish darajasida emas, balki oʻqish darajasida kuzatadi, bu aniqroq qayta chizishlarni beradi — faqat oʻzgartirilgan xususiyatni oʻqigan view yangilanadi.
Ammo bu @Published eskirgan degani emas. @Published Combine quvurlari bilan integratsiya kerak boʻlganda zarur boʻlib qoladi — $propertyName proyeksiyasi @Observable da mavjud boʻlmagan publisher beradi. Bundan tashqari, iOS 16 va undan past versiyalar bilan orqaga qarab moslik uchun @Published+ObservableObject yagona variantdir. Apple WWDC 2023 „Discover Observation in SwiftUI” sessiyasiga koʻra, Apple yangi loyihalar uchun @Observable ni tavsiya qiladi, ammo mavjud kod va Combine stsenariylari uchun @Published qoʻllab-quvvatlashini aniq saqlab qoladi.
Amalda koʻplab loyihalar gibrid yondashuvdan foydalanadi: yangi maʻlumot modellari @Observable bilan yoziladi, mavjud ObservableObject lar esa @Published bilan refaktoring qilinmasdan qoladi. @Published shuningdek nashr qilish ustida nozik nazorat talab qilinganda ajralmas hisoblanadi — masalan, bir nechta xususiyatlarning guruhli yangilanishi tugagunga qadar xabarnomani kechiktirish.
Birinchi xato — @Published ni strukturada qoʻllash. Kompilyator xato chiqaradi: „Property wrapper cannot be applied to a computed property” yoki „'@Published' is only available on members of a class”. @Published maʻlumot semantikasini talab qiladi, chunki ObservableObjectPublisher har bir nusxa uchun noyob boʻlishi kerak boʻlgan sinfdir.
Ikkinchi xato — maʻlumot xususiyati tarkibining mutatsiyasi havolani almashtirmasdan. Agar @Published xususiyati [String] massiv turiga ega boʻlsa va siz array.append("new") ni chaqirsangiz, @Published oʻzgarishni sezmaydi, chunki massivga havola oʻzgarmagan. Yechim: xususiyatga yangi qiymat bering array = array + ["new"] yoki qoʻlda objectWillChange.send() dan foydalaning.
Uchinchi xato — haddan tashqari koʻp @Published xususiyatlari. Har bir @Published xususiyati ObservableObject ga obuna boʻlgan barcha view-larning qayta chizilishiga sabab boʻladi, faqat shu xususiyatni oʻqiganlarning emas. Point-Free (2025) maʻlumotlariga koʻra, bitta katta ObservableObject ni @StateObject va @EnvironmentObject bilan bir nechta kichiklarga boʻlish keraksiz qayta chizishlar sonini kamaytiradi va samaradorlikni oshiradi.
Birinchi misol — validatsiya bilan roʻyxatdan oʻtish formasi ViewModel i. @Published email va password xususiyatlari Combine quvuri orqali validatsiya xatolarini koʻrsatishga sabab boʻladi:
class RegistrationViewModel: ObservableObject {
@Published var email = ""
@Published var password = ""
@Published var emailError: String?
@Published var isFormValid = false
private var cancellables = Set<AnyCancellable>()
init() {
$email
.map { $0.contains("@") ? nil : "Invalid email" }
.assign(to: &$emailError)
.store(in: &cancellables)
$email.combineLatest($password)
.map { !$0.isEmpty && !$1.isEmpty }
.assign(to: &$isFormValid)
.store(in: &cancellables)
}
}
Ikkinchi misol — maʻlumot elementlari kolleksiyasi uchun qoʻlda nashr qilish. Element ichidagi har bir oʻzgarishda butun massivni almashtirish oʻrniga objectWillChange.send() ishlatiladi:
class TodoItem {
var title: String
var isDone = false
init(title: String) { self.title = title }
}
class TodoListViewModel: ObservableObject {
@Published var items: [TodoItem] = []
func toggle(item: TodoItem) {
item.isDone.toggle()
self.objectWillChange.send() // qoʻlda xabarnoma
}
}
Uchinchi misol — Combine orqali @Published xususiyatiga Assign. Swift 5.9 yangi sintaksisidan foydalanib, Optional oʻramisiz assign(to: &$property) proyeksiyasi orqali toʻgʻridan-toʻgʻri tayinlash mumkin. Bu obuna yaratmasdan publisherni @Published xususiyatiga bogʻlashning eng qisqa yoʻlidir.
Tez-tez beriladigan savollar
Yoʻq, @Published faqat ObservableObject ga mos keladigan sinf ichida qoʻllanilishi mumkin. Strukturalarda lokal holat uchun @State yoki iOS 17+ da @Observable makrosi bilan @Bindable dan foydalaning. Strukturada @Published qoʻllashga urinish kompilyatsiya xatosiga olib keladi.
Toʻgʻri: yangi qiymatni toʻliq tayinlang (array = array + ["new"]). @Published havolaning almashtirilishini kuzatadi, tarkibning mutatsiyasini emas. Maʻlumot turidagi kolleksiyalar uchun elementlarning ichki holati mutatsiyasidan keyin qoʻlda objectWillChange.send() ni chaqiring.
@State bitta view ichida lokal holat uchun moʻljallangan va faqat qiymat turlari bilan ishlaydi. @Published — @ObservedObject yoki @EnvironmentObject orqali bir nechta view tomonidan oʻqilishi mumkin boʻlgan ObservableObject xususiyatlari uchun. @State soddaroq, @Published Combine bilan integratsiyasi tufayli kuchliroq.
Faqat oʻzgarishlari UI ni yangilashi kerak boʻlganlar uchun. Ichki hisob-kitoblar, kesh yoki vaqtinchalik bayroqlar @Published talab qilmaydi — bu keraksiz qayta chizishlar sonini kamaytiradi. @Published ni „bu xususiyat interfeys uchun muhim” signali sifatida ishlating.
SwiftUI Core Data bilan @FetchRequest va NSManagedObject uchun @ObservedObject orqali integratsiyalanadi. ManagedObject allaqachon ObservableObject ga mos keladi, shuning uchun @Published kerak emas — NSManagedObject oʻzi oʻzgarishlar haqida xabar beradi. @Published maʻlumotlarni transformatsiya qilish uchun Core Data va UI oʻrtasidagi ViewModel qatlamida ishlatiladi.
Xulosa
objectWillChange.send() ni chaqiradi, $property proyeksiyasi orqali publisher yaratadiassign(to: &$property) publisherni toʻgʻridan-toʻgʻri @Published xususiyatiga obuna qilish imkonini beradiBiz 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.
Shuningdek o'qing