@Published: এটি কী, কার্যপ্রণালী এবং প্রয়োগ

লেখক: IT Sectr প্রকাশিত: 2026-06-19 পড়ার সময়: 8 মিনিট

@Published হল Combine ফ্রেমওয়ার্কের একটি property wrapper যা ObservableObject প্রোটোকল মেনে চলা ক্লাসের বৈশিষ্ট্যের পরিবর্তন স্বয়ংক্রিয়ভাবে প্রকাশ করে। যখন @Published দ্বারা চিহ্নিত একটি বৈশিষ্ট্যের মান পরিবর্তিত হয়, SwiftUI objectWillChange-এর মাধ্যমে একটি সিগন্যাল পায় এবং সেই অবজেক্টে সাবস্ক্রাইব করা সমস্ত ভিউ পুনরায় রেন্ডার করে। Apple Combine Framework ডকুমেন্টেশন (2025) অনুসারে, @Published একটি Publisher তৈরি করে যা Combine অপারেটর: map, filter, debounce এবং অন্যান্যের মাধ্যমে অতিরিক্ত রূপান্তর করা যেতে পারে। এটি @Published-কে MVVM আর্কিটেকচারে ডেটা এবং ব্যবহারকারী ইন্টারফেসের মধ্যে একটি মূল সেতু বানায়।

মূল বিষয়

  • @Published — SwiftUI এবং Combine-এ ObservableObject বৈশিষ্ট্যের পরিবর্তন স্বয়ংক্রিয় প্রকাশের জন্য property wrapper
  • পদ্ধতি: মান পরিবর্তনে objectWillChange কল হয়, যা সাবস্ক্রাইব করা ভিউ-এর পুনরায় রেন্ডার ট্রিগার করে
  • Publisher প্রজেকশন $property-এর মাধ্যমে অ্যাক্সেসযোগ্য — স্ট্রিম সাবস্ক্রাইব, সংযুক্ত এবং রূপান্তর করা যায়
  • ObservedObject এবং StateObject স্বয়ংক্রিয়ভাবে @Published বৈশিষ্ট্যে সাবস্ক্রাইব করে — ম্যানুয়াল সাবস্ক্রিপশনের প্রয়োজন নেই
  • iOS 17+ @Observable ম্যাক্রো একটি বিকল্প প্রস্তাব করে, কিন্তু @Published Combine পাইপলাইনের জন্য মানক থাকে

@Published কী?

@Published হল Combine মডিউলে সংজ্ঞায়িত একটি property wrapper যা একটি ক্লাসের বৈশিষ্ট্যের পরিবর্তন সম্পর্কে সাবস্ক্রাইবারদের স্বয়ংক্রিয়ভাবে জানানোর ক্ষমতা যোগ করে। এটি শুধুমাত্র একটি ক্লাসের অভ্যন্তরে (স্ট্রাকচারে নয়) এবং শুধুমাত্র ObservableObject প্রোটোকল মেনে চলা ক্লাসের বৈশিষ্ট্যে ব্যবহার করা যেতে পারে।

যখন একটি @Published বৈশিষ্ট্যের মান পরিবর্তিত হয়, Combine ডলার উপসর্গের মাধ্যমে অ্যাক্সেসযোগ্য একটি অন্তর্নির্মিত publisher-এর মাধ্যমে একটি ইভেন্ট তৈরি করে: $propertyName। এই publisherটি একটি ObservableObjectPublisher, যা ObservableObject-এর নিজস্ব। SwiftUI স্বয়ংক্রিয়ভাবে এতে সাবস্ক্রাইব করে যখন একটি ভিউ @ObservedObject বা @StateObject ব্যবহার করে, এবং অবজেক্টের ভেতরে যেকোনো @Published বৈশিষ্ট্য পরিবর্তিত হলে ভিউটি পুনরায় রেন্ডার করে।

ম্যাট নিউবার্গের বই “IOS 18 Programming Fundamentals with Swift” (2025) অনুসারে, @Published হল willSet প্যাটার্নের উপর একটি সুবিধাজনক আবরণ, যা স্বয়ংক্রিয়ভাবে objectWillChange.send() কল করে। প্রকৃতপক্ষে, কম্পাইলার @Published-কে willSet পর্যবেক্ষক সহ একটি computed property-তে বিস্তৃত করে, যা ম্যানুয়াল বাস্তবায়নের তুলনায় রানটাইমে শূন্য ওভারহেড প্রদান করে।

সেই সমস্ত ObservableObject বৈশিষ্ট্যের জন্য @Published ব্যবহার করুন যাদের পরিবর্তন ইন্টারফেসে প্রতিফলিত হওয়া উচিত। UI-কে প্রভাবিত করে না এমন বৈশিষ্ট্যের জন্য, @Published ছাড়া সাধারণ stored properties অপ্রয়োজনীয় পুনরায় রেন্ডারিং কমায়।

@Published কীভাবে কাজ করে

@Published কম্পাইলেশনের সময় দুটি মূল উপাদান তৈরি করে। প্রথমটি হল willSet-পর্যবেক্ষক সহ একটি সংরক্ষিত বৈশিষ্ট্য যা নতুন মান লেখার আগে objectWillChange.send() কল করে। দ্বিতীয়টি হল প্রজেকশন $propertyName, যা একটি Published.Publisher ফেরত দেয় যা সরাসরি Combine পাইপলাইনে ব্যবহার করা যেতে পারে।

তিনটি বৈশিষ্ট্য সহ Settings ক্লাসটি বিবেচনা করুন: দুটি @Published এবং একটি সাধারণ:

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

যখন username বা isDarkMode পরিবর্তিত হয়, SwiftUI Settings ইনস্ট্যান্সে সাবস্ক্রাইব করা সমস্ত ভিউ পুনরায় রেন্ডার করবে। lastLogin পরিবর্তন করলে পুনরায় রেন্ডার ট্রিগার হবে না। যদি আপনাকে একটি সাধারণ বৈশিষ্ট্যের পরিবর্তন সম্পর্কে সাবস্ক্রাইবারদের ম্যানুয়ালি জানানোর প্রয়োজন হয়, তাহলে আপনি willSet পর্যবেক্ষকে objectWillChange.send() কল করতে পারেন।

একটি গুরুত্বপূর্ণ বিবরণ: @Published শুধুমাত্র তখনই পরিবর্তন প্রকাশ করে যখন একটি বৈশিষ্ট্য সরাসরি নির্ধারিত হয়। যদি বৈশিষ্ট্যটি একটি রেফারেন্স টাইপ (ক্লাস) হয় এবং রেফারেন্স প্রতিস্থাপন না করে এর অভ্যন্তরীণ অবস্থা পরিবর্তিত হয়, তাহলে @Published এটি সনাক্ত করবে না। এই ধরনের ক্ষেত্রে, ম্যানুয়াল ইভেন্ট পাঠানো বা একটি ভ্যালু টাইপ (স্ট্রাকচার)-এ স্যুইচ করা প্রয়োজন।

@Published এবং Combine

@Published Combine-এর সাথে নিবিড়ভাবে একীভূত — প্রতিটি @Published বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে একটি publisher সরবরাহ করে যা প্রজেকশন $propertyName-এর মাধ্যমে অ্যাক্সেসযোগ্য। এটি ফিল্টারিং, রূপান্তর, সংযুক্তি এবং বিলম্বিত মান প্রক্রিয়াকরণের জন্য Combine অপারেটর ব্যবহারের অনুমতি দেয়।

একটি সাধারণ দৃশ্যকল্প হল debounce-সহ অনুসন্ধান। একটি ইনপুট ফিল্ড @Published বৈশিষ্ট্য searchText-এর সাথে আবদ্ধ, কিন্তু সার্ভার অনুরোধটি শুধুমাত্র 300 মিসে বিরতির পরে পাঠানো উচিত। $searchText.debounce-সহ Combine এটি এক লাইনে সমাধান করে:

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

জন সান্ডেলের নিবন্ধ (Swift by Sundell, 2024) অনুসারে, Combine-এর সাথে @Published সংযুক্ত করা SwiftUI অ্যাপ্লিকেশনগুলিতে রিঅ্যাকটিভ পাইপলাইনের জন্য একটি মানক প্যাটার্ন: ভ্যালিডেশন, debounce, throttle, combineLatest, অন্যান্য publishers-এর সাথে মার্জ। @Published ইম্পেরেটিভ UI কোড এবং রিঅ্যাকটিভ Combine-এর মধ্যে একটি সেতু হিসেবে কাজ করে।

@Published বনাম @Observable ম্যাক্রো

iOS 17 প্রকাশের সাথে, Apple @Observable ম্যাক্রো উপস্থাপন করেছে, যা ObservableObject এবং @Published ছাড়া রিঅ্যাকটিভিটির একটি বিকল্প পদ্ধতি প্রদান করে। @Observable লেখার পরিবর্তে পড়ার স্তরে বৈশিষ্ট্যগুলিতে অ্যাক্সেস স্বয়ংক্রিয়ভাবে ট্র্যাক করে, যা আরও নির্ভুল পুনরায় রেন্ডারিং প্রদান করে — শুধুমাত্র সেই ভিউ আপডেট হয় যা একটি নির্দিষ্ট পরিবর্তিত বৈশিষ্ট্য পড়ে।

তবে, এর অর্থ এই নয় যে @Published অপ্রচলিত। @Published প্রয়োজনীয় থাকে যখন Combine পাইপলাইন একীকরণের প্রয়োজন হয় — প্রজেকশন $propertyName একটি publisher সরবরাহ করে যা @Observable-এর নেই। অতিরিক্তভাবে, iOS 16 এবং নিচের সাথে পশ্চাদগামী সামঞ্জস্যের জন্য, @Published+ObservableObject হল একমাত্র বিকল্প। Apple WWDC 2023 সেশন “Discover Observation in SwiftUI” অনুসারে, Apple নতুন প্রকল্পের জন্য @Observable সুপারিশ করে, কিন্তু বিদ্যমান কোড এবং Combine দৃশ্যকল্পের জন্য @Published-এর সমর্থন স্পষ্টভাবে বজায় রাখে।

ব্যবহারিকভাবে, অনেক প্রকল্প একটি হাইব্রিড পদ্ধতি ব্যবহার করে: নতুন ডেটা মডেল @Observable ব্যবহার করে, যখন @Published-সহ বিদ্যমান ObservableObject রিফ্যাক্টরিং ছাড়াই থাকে। @Published তখনও অপরিহার্য যখন প্রকাশের উপর সূক্ষ্ম নিয়ন্ত্রণ প্রয়োজন — উদাহরণস্বরূপ, একাধিক বৈশিষ্ট্যের ব্যাচ আপডেট সম্পূর্ণ না হওয়া পর্যন্ত বিজ্ঞপ্তি বিলম্বিত করা।

@Published-এর সাথে সাধারণ ভুল

প্রথম ভুলটি হল স্ট্রাকচারে @Published ব্যবহার করা। কম্পাইলার একটি ত্রুটি দেবে: “Property wrapper cannot be applied to a computed property” বা “‘@Published’ is only available on members of a class.” @Published-এর রেফারেন্স সিম্যান্টিক্স প্রয়োজন কারণ ObservableObjectPublisher একটি ক্লাস যা প্রতিটি ইনস্ট্যান্সের জন্য অনন্য হতে হবে।

দ্বিতীয় ভুলটি হল রেফারেন্স প্রতিস্থাপন না করে একটি রেফারেন্স বৈশিষ্ট্যের বিষয়বস্তু পরিবর্তন করা। যদি একটি @Published বৈশিষ্ট্য অ্যারে টাইপ [String]-এর হয় এবং আপনি array.append("new") কল করেন, @Published পরিবর্তন সনাক্ত করবে না কারণ অ্যারের রেফারেন্স পরিবর্তিত হয়নি। সমাধান: বৈশিষ্ট্যটিতে একটি নতুন মান নির্ধারণ করুন array = array + ["new"] অথবা ম্যানুয়ালি objectWillChange.send() ব্যবহার করুন।

তৃতীয় ভুলটি হল @Published বৈশিষ্ট্যের অত্যধিক সংখ্যা। প্রতিটি @Published বৈশিষ্ট্য ObservableObject-এ সাবস্ক্রাইব করা সমস্ত ভিউ-এর পুনরায় রেন্ডার ট্রিগার করে, শুধুমাত্র সেই ভিউগুলি নয় যারা সেই বৈশিষ্ট্যটি পড়ে। Point-Free (2025) অনুসারে, একটি বড় ObservableObject-কে @StateObject এবং @EnvironmentObject-সহ কয়েকটি ছোট ObservableObject-এ বিভক্ত করা অপ্রয়োজনীয় পুনরায় রেন্ডারিং কমায় এবং কর্মক্ষমতা উন্নত করে।

কোড উদাহরণ

প্রথম উদাহরণটি হল ভ্যালিডেশন-সহ একটি রেজিস্ট্রেশন ফর্মের ViewModel। @Published বৈশিষ্ট্য email এবং password একটি Combine পাইপলাইনের মাধ্যমে ভ্যালিডেশন ত্রুটি প্রদর্শন ট্রিগার করে:

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

দ্বিতীয় উদাহরণটি হল রেফারেন্স উপাদানের সংগ্রহের জন্য ম্যানুয়াল প্রকাশনা। একটি উপাদানের ভিতরে প্রতিটি পরিবর্তনে পুরো অ্যারে প্রতিস্থাপন করার পরিবর্তে, objectWillChange.send() ব্যবহার করা হয়:

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()  // manual notification
    }
}

তৃতীয় উদাহরণটি হল Combine-এর মাধ্যমে একটি @Published বৈশিষ্ট্যে Assign। Swift 5.9-এর নতুন সিনট্যাক্স ব্যবহার করে, আপনি Optional র্যাপার ছাড়া প্রজেকশন assign(to: &$property)-এর মাধ্যমে সরাসরি নির্ধারণ করতে পারেন। একটি সাবস্ক্রিপশন তৈরি না করে একটি publisher-কে @Published বৈশিষ্ট্যের সাথে সংযুক্ত করার এটি是最 ছোট উপায়।

সচরাচর জিজ্ঞাসা

@Published কি স্ট্রাকচারে ব্যবহার করা যাবে?

না, @Published শুধুমাত্র ObservableObject মেনে চলা একটি ক্লাসের ভিতরে ব্যবহার করা যেতে পারে। স্ট্রাকচারে, স্থানীয় অবস্থার জন্য @State বা iOS 17+-এ @Observable ম্যাক্রো-সহ @Bindable ব্যবহার করুন। স্ট্রাকচারে @Published ব্যবহার করার চেষ্টা করলে একটি কম্পাইলেশন ত্রুটি হবে।

@Published অ্যারে এবং ডিকশনারির সাথে কীভাবে কাজ করে?

সঠিক পদ্ধতি: সম্পূর্ণ নতুন মান নির্ধারণ করুন (array = array + ["new"]). @Published রেফারেন্স প্রতিস্থাপন ট্র্যাক করে, বিষয়বস্তু পরিবর্তন নয়। রেফারেন্স টাইপের সংগ্রহের জন্য, উপাদানের অভ্যন্তরীণ অবস্থা পরিবর্তনের পরে ম্যানুয়াল objectWillChange.send() ব্যবহার করুন।

@Published কীভাবে @State থেকে আলাদা?

@State একটি একক ভিউ-এর ভিতরে স্থানীয় অবস্থার জন্য ডিজাইন করা হয়েছে এবং শুধুমাত্র ভ্যালু টাইপের সাথে কাজ করে। @Published ObservableObject বৈশিষ্ট্যের জন্য যা @ObservedObject বা @EnvironmentObject-এর মাধ্যমে একাধিক ভিউ দ্বারা পড়া যেতে পারে। @State সহজ, @Published Combine একীকরণের কারণে বেশি শক্তিশালী।

প্রত্যেকটি ObservableObject বৈশিষ্ট্যের কি @Published প্রয়োজন?

শুধুমাত্র সেগুলির যাদের পরিবর্তন UI আপডেট করা উচিত। অভ্যন্তরীণ গণনা, ক্যাশে বা অস্থায়ী ফ্ল্যাগের জন্য বৈশিষ্ট্যগুলির @Published প্রয়োজন নেই — এটি অপ্রয়োজনীয় পুনরায় রেন্ডারিং কমায়। @Published একটি সংকেত হিসেবে ব্যবহার করুন যে “এই বৈশিষ্ট্যটি ইন্টারফেসের জন্য গুরুত্বপূর্ণ।”

@Published Core Data-র সাথে কীভাবে কাজ করে?

SwiftUI, NSManagedObject-এর জন্য @FetchRequest এবং @ObservedObject-এর মাধ্যমে Core Data-র সাথে একীভূত হয়। ManagedObject ইতিমধ্যেই ObservableObject মেনে চলে, তাই @Published প্রয়োজন নেই — NSManagedObject নিজেই পরিবর্তন জানায়। @Published ডেটা রূপান্তরের জন্য Core Data এবং UI-এর মধ্যে ViewModel স্তরে ব্যবহৃত হয়।

সারসংক্ষেপ

  • @Published — Combine-এর property wrapper যা SwiftUI এবং Combine পাইপলাইনের জন্য ObservableObject বৈশিষ্ট্যের পরিবর্তন স্বয়ংক্রিয়ভাবে প্রকাশ করে
  • পদ্ধতি: একটি willSet পর্যবেক্ষক objectWillChange.send() কল করে, প্রজেকশন $property-এর মাধ্যমে একটি publisher তৈরি করে
  • Combine: @Published debounce, map, combineLatest এবং অন্যান্য অপারেটরের জন্য publisher সরবরাহ করে — UI এবং রিঅ্যাকটিভ পাইপলাইনের মধ্যে একটি সেতু
  • @Observable (iOS 17+) — নতুন প্রকল্পের জন্য একটি বিকল্প, কিন্তু @Published Combine এবং পশ্চাদগামী সামঞ্জস্যের জন্য মানক থাকে
  • ভুল: @Published স্ট্রাকচারে কাজ করে না, রেফারেন্স টাইপ মিউটেশন ট্র্যাক করে না, অত্যধিক @Published বৈশিষ্ট্য পুনরায় রেন্ডারিং বাড়ায়
  • সেরা অভ্যাস: শুধুমাত্র UI-প্রভাবিত বৈশিষ্ট্যগুলিকে @Published দিয়ে চিহ্নিত করুন, বড় ObservableObject-কে কয়েকটি ছোটে ভাগ করুন
  • Assign: Swift 5.9-এ assign(to: &$property) একটি publisher-কে সরাসরি @Published বৈশিষ্ট্যে সাবস্ক্রাইব করার অনুমতি দেয়

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন