@Published: bu nədir, işləmə prinsipi və tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-06-19 Oxuma vaxtı: 8 dəq

@Published — Combine frameworkundən olan property wrapper-dır, ObservableObject protokoluna uyğun sinifin xüsusiyyətinin dəyişikliklərini avtomatik olaraq dərc edir. @Published ilə işarələnmiş xüsusiyyətin dəyəri dəyişəndə SwiftUI objectWillChange vasitəsilə siqnal alır və bu obyektə abunə olmuş bütün view-ləri yenidən çəkir. Apple Combine Framework Documentation (2025) məlumatlarına görə, @Published Publisher yaradır və onu əlavə olaraq Combine operatorları ilə transformasiya etmək olar: map, filter, debounce və digərləri. Bu, @Published-i MVVM arxitekturasında məlumatlar və istifadəçi interfeysi arasında açar rol oynayan körpü edir.

Başlıca

  • @Published — SwiftUI və Combine-də ObservableObject xüsusiyyətlərinin dəyişikliklərini avtomatik dərc etmək üçün property wrapper
  • Mexanizm: dəyər dəyişəndə objectWillChange çağırılır, bu da abunə olunmuş view-lərin yenidən çəkilməsinə səbəb olur
  • Publisher $property proyeksiyası vasitəsilə əlçatan olduğuna görə axına abunə olmaq, birləşdirmək və transformasiya etmək olar
  • ObservedObjectStateObject avtomatik olaraq @Published xüsusiyyətlərinə abunə olur — əl ilə abunəlik tələb olunmur
  • iOS 17+ @Observable makrosu alternativ təklif edir, lakin @Published Combine pipeline-ları üçün standart olaraq qalır

@Published nədir?

@Published — Combine modulunda müəyyən edilmiş property wrapper-dır, sinifin xüsusiyyətinə abunəçiləri dəyişikliklər barədə avtomatik məlumatlandırmaq imkanı əlavə edir. O, yalnız sinif daxilində (strukturlarda deyil) və yalnız ObservableObject protokoluna uyğun sinifin xüsusiyyətlərinə tətbiq edilə bilər.

@Published xüsusiyyətinin dəyəri dəyişəndə, Combine daxili publisher vasitəsilə hadisə yaradır, ona dollar prefiksi ilə daxil olmaq olar: $propertyName. Bu publisher ObservableObjectPublisher-dir, ObservableObject-in özünə məxsusdur. SwiftUI avtomatik olaraq ona abunə olur, view @ObservedObject və ya @StateObject istifadə etdikdə, və obyekt daxilində istənilən @Published xüsusiyyəti dəyişəndə view-i yenidən çəkir.

Matt Neuburgun „IOS 18 Programming Fundamentals with Swift” (2025) kitabına görə, @Published willSet nümunəsinin rahat bir sarğıcısıdır, avtomatik olaraq objectWillChange.send() çağırır. Kompilyator @Published-i willSet müşahidəçisi ilə hesablanan xüsusiyyətə çevirir ki, bu da əl ilə edilən tətbiqlə müqayisədə runtime üzərində sıfır yük yaradır.

Dəyişiklikləri interfeysdə əks olunmalı olan bütün ObservableObject xüsusiyyətləri üçün @Published istifadə edin. UI-ya təsir etməyən xüsusiyyətlər üçün adi stored properties-lər @Published olmadan lazımsız yenidən çəkmələrin sayını azaldır.

@Published necə işləyir

@Published kompilasiya zamanı iki açar element yaradır. Birincisi — yeni dəyər yazılmazdan əvvəl objectWillChange.send() çağıran willSet müşahidəçisi olan saxlanılan xüsusiyyət. İkincisi — Published.Publisher qaytaran $propertyName proyeksiyası, birbaşa Combine pipeline-larında istifadə edilə bilər.

Settings sinfini üç xüsusiyyətlə nəzərdən keçirək: ikisi @Published və biri adi:

swift
class Settings: ObservableObject {
    @Published var username: String = "Guest"
    @Published var isDarkMode = false
    var lastLogin: Date = Date()  // @Published olmadan
}

username və ya isDarkMode dəyişəndə SwiftUI Settings nümunəsinə abunə olmuş bütün view-ləri yenidən çəkir. lastLogin dəyişikliyi yenidən çəkməyə səbəb olmur. Adi bir xüsusiyyətin dəyişməsi barədə abunəçiləri əl ilə məlumatlandırmaq lazımdırsa, willSet müşahidəçisində objectWillChange.send() çağıra bilərsiniz.

Vacib detal: @Published dəyişiklikləri yalnız birbaşa xüsusiyyətə yazılma zamanı dərc edir. Xüsusiyyət istinad tipidirsə (sinif) və istinad dəyişdirilmədən onun daxili vəziyyəti dəyişirsə, @Published bunu görməz. Belə hallarda hadisənin əl ilə göndərilməsi və ya dəyər tipi ilə (struktur) əvəz edilməsi tələb olunur.

@Published və Combine

@Published Combine ilə sıx inteqrasiya edilmişdir — hər bir @Published xüsusiyyəti avtomatik olaraq $propertyName proyeksiyası vasitəsilə əlçatan publisher təqdim edir. Bu, dəyərlərin filtrasiyası, transformasiyası, birləşdirilməsi və gecikdirilmiş emalı üçün Combine operatorlarını tətbiq etməyə imkan verir.

Tipik ssenari — debounce ilə axtarış. Giriş sahəsi @Published searchText xüsusiyyətinə bağlıdır, lakin serverə sorğu yalnız 300 ms fasilədən sonra göndərilməlidir. Combine $searchText.debounce ilə bunu bir sətirlə həll edir:

swift
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-in məqaləsinə (Swift by Sundell, 2024) görə, @Published-i Combine ilə birləşdirmək SwiftUI tətbiqlərində reaktiv pipeline-lar üçün standart nümunədir: validation, debounce, throttle, combineLatest, digər publisher-lərlə merge. @Published imperativ UI kodu ilə reaktiv Combine arasında körpü rolunu oynayır.

@Published vs @Observable makrosu

iOS 17-nin buraxılması ilə Apple ObservableObject və @Published olmadan reaktivliyə alternativ yanaşma təklif edən @Observable makrosunu təqdim etdi. @Observable xüsusiyyətlərə girişi oxu səviyyəsində izləyir, yazı səviyyəsində yox, bu da daha dəqiq yenidən çıkmaları təmin edir — yalnız konkret dəyişdirilmiş xüsusiyyəti oxuyan view yenilənir.

Lakin bu @Published-in köhnəldiyi anlamına gəlmir. @Published Combine pipeline-ları ilɘ inteqrasiya tələb olunduqda zəruri olaraq qalır — $propertyName proyeksiyası @Observable-də olmayan publisher verir. Bundan əlavə, iOS 16 və aşağı ilə geriyə uyğunluq üçün @Published+ObservableObject yeganı seçimdir. Apple WWDC 2023 „Discover Observation in SwiftUI” sessiyasına görə, Apple yeni layihələr üçün @Observable tövsiyə edir, lakin mövcud kod və Combine ssenariləri üçün @Published dəstəyini açıqça saxlayır.

Təcrübədə bir çox layihə hibrid yanaşma tətbiq edir: yeni məlumat modelləri @Observable ilə yazılır, mövcud ObservableObject-lər isə @Published ilə refaktorinqsiz qalır. @Published həmçinin dərc etmə üzərində incə nəzarət tələb olunduqda əvəzolunmazdır — məsələn, bir neçə xüsusiyyətin toplu yenilənməsi tamamlanana qədər bildirişi təxirə salmaq.

@Published ilə tipik səhvlər

Birinci səhv — @Published-in strukturda tətbiqi. Kompilyator səhv verəcək: „Property wrapper cannot be applied to a computed property” və ya „'@Published' is only available on members of a class”. @Published istinad semantikası tələb edir, çünki ObservableObjectPublisher hər bir nümunə üçün unikal olmalı olan sinifdir.

İkinci səhv — istinad xüsusiyyətinin məzmununun mutasiyası istinadı əvəz etmədən. @Published xüsusiyyəti [String] massiv tipinə malikdirsə və siz array.append("new") çağırırsınızsa, @Published dəyişikliyi görməyəcək, çünki massivə istinad dəyişməyib. Həll: xüsusiyyətə yeni dəyər təyin edin array = array + ["new"] və ya əl ilə objectWillChange.send() istifadə edin.

Üçüncü səhv — həddindən artıq @Published xüsusiyyətləri. Hər bir @Published xüsusiyyəti ObservableObject-ə abunə olmuş bütün view-lərin yenidən çəkilməsinə səbəb olur, yalnız bu xüsusiyyəti oxuyanların deyil. Point-Free (2025) məlumatlarına görə, bir böyük ObservableObject-i @StateObject vɘ @EnvironmentObject ilə bir neçə kiçik ObservableObject-ə bölmək lazımsız yenidən çəkmələrin sayını azaldır və performansı yaxşılaşdırır.

Kod nümunələri

Birinci nümunə — validasiya ilə qeydiyyat formasının ViewModel-i. @Published emailpassword xüsusiyyətləri Combine pipeline vasitəsilə validasiya xətalarının göstərilməsinə səbəb olur:

swift
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)
    }
}

İkinci nümunə — istinad elementləri kolleksiyası üçün əl ilə dərc etmə. Element daxilində hər dəyişiklikdə bütün massivi əvəz etmək əvəzinə objectWillChange.send() istifadə olunur:

swift
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()  // əl ilə bildiriş
    }
}

Üçüncü nümunə — Combine vasitəsilə @Published xüsusiyyətinə Assign. Swift 5.9-un yeni sintaksisindən istifadə edərək, Optional sarğıcısı olmadan assign(to: &$property) proyeksiyası vasitəsilə birbaşa təyin etmək olar. Bu, abunə yaratmadan publisherni @Published xüsusiyyətinə bağlamağın ən qısa yoludur.

Tez-tez verilən suallar

Strukturda @Published istifadə etmək olarmı?

Xeyr, @Published yalnız ObservableObject-ə uyğun sinif daxilində tətbiq edilə bilər. Strukturlarda lokal vəziyyət üçün @State və ya iOS 17+-də @Observable makrosu ilə @Bindable istifadə edin. Strukturda @Published tətbiq etmək cəhdi kompilasiya xətasına səbəb olacaq.

@Published massivlər və lüğətlərlə necə işləyir?

Düzgün: yeni dəyəri tamamilə təyin edin (array = array + ["new"]). @Published istinadın əvəz edilməsini izləyir, məzmunun mutasiyasını yox. İstinad tipli kolleksiyalar üçün elementlərin daxili vəziyyətinin mutasiyasından sonra objectWillChange.send() əl ilə çağırın.

@Published @State-dən nə ilə fərqlənir?

@State bir view daxilində lokal vəziyyət üçün nəzərdə tutulub və yalnız dəyər tipləri ilə işləyir. @Published — @ObservedObject və ya @EnvironmentObject vasitəsilə bir çox view tərəfindən oxuna bilən ObservableObject xüsusiyyətləri üçündür. @State daha sadədir, @Published Combine ilɘ inteqrasiya sayəsindɘ daha güclüdür.

ObservableObject-in hər xüsusiyyəti üçün @Published lazımdırmı?

Yalnız dəyişiklikləri UI-nı yeniləməli olanlar üçün. Daxili hesablamalar, keş və ya müvəqqəi bayraqlar üçün @Published tələb olunmur — bu lazımsız yenidən çəkmələrin sayını azaldır. @Published-i „bu xüsusiyyət interfeys üçün vacibdir” siqnalı kimi istifadə edin.

@Published Core Data ilə necə işləyir?

SwiftUI Core Data ilə @FetchRequest və NSManagedObject üçün @ObservedObject vasitəsilə inteqrasiya edir. ManagedObject artıq ObservableObject-ə uyğundur, ona görə @Published lazım deyil — NSManagedObject özü dəyişikliklər barədə məlumatlandırır. @Published məlumatların transformasiyası üçün Core Data və UI arasındakı ViewModel qatında istifadə olunur.

Nəticə

  • @Published — Combine-dən property wrapper, SwiftUI və Combine pipeline-ları üçün ObservableObject xüsusiyyətlərinin dəyişikliklərini avtomatik dərc edir
  • Mexanizm: willSet müşahidəçisi objectWillChange.send() çağırır, $property proyeksiyası vasitəsilə publisher yaradır
  • Combine: @Published debounce, map, combineLatest və digər operatorlar üçün publisher verir — bu UI ilə reaktiv pipeline-lar arasında körpüdür
  • @Observable (iOS 17+) — yeni layihələr üçün alternativ, lakin @Published Combine və geriyə uyğunluq üçün standart olaraq qalır
  • Səhvlər: @Published strukturlarda işləmir, istinad tiplərinin mutasiyasını izləmir, həddindən artıq @Published yenidən çəkmələri artırır
  • Best practice: @Published ilə yalnız UI-ya təsir edən xüsusiyyətləri qeyd edin, böyük ObservableObject-i bir neçə kiçik hissəyə bölün
  • Assign: Swift 5.9-da assign(to: &$property) publisherni birbaşa @Published xüsusiyyətinə abunə etməyə imkan verir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun