SwiftUI — মূল ধারণা: View, State এবং Data Flow

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

SwiftUI — সমস্ত ইকোসিস্টেম প্ল্যাটফর্মে ইউজার ইন্টারফেস তৈরির জন্য Apple এর ডিক্লেয়ারেটিভ ফ্রেমওয়ার্ক, WWDC 2019 এ উপস্থাপিত। ইম্পেরেটিভ UIKit এবং এর viewDidLoad ও ম্যানুয়াল স্ক্রিন আপডেটের বিপরীতে, SwiftUI UI-কে View প্রোটোকল অনুসরণকারী সরল স্ট্রাকচারের সংগ্রহ হিসেবে বর্ণনা করে। Swift.org (2025) অনুসারে, App Store-এ প্রকাশিত 65% নতুন প্রকল্পে SwiftUI ব্যবহৃত হয়। ফ্রেমওয়ার্কটি State এবং Data Flow মেকানিজমের মাধ্যমে স্বয়ংক্রিয়ভাবে ইন্টারফেস আপডেট পরিচালনা করে — ডেটা পরিবর্তিত হলে View ম্যানুয়াল reloadData কল ছাড়াই পুনরায় আঁকে।

মূল পয়েন্টসমূহ

  • SwiftUI — Apple এর ডিক্লেয়ারেটিভ UI ফ্রেমওয়ার্ক (2019), যেখানে ইন্টারফেস View প্রোটোকল অনুসরণকারী স্ট্রাকচার দ্বারা বর্ণিত হয়।
  • View — SwiftUI এর মৌলিক বিল্ডিং ব্লক; প্রতিটি View computed property body-এর মাধ্যমে স্ক্রিনের নিজস্ব অংশ বর্ণনা করে।
  • @State — লোকাল স্টেট সংরক্ষণের জন্য property wrapper, পরিবর্তিত হলে View স্বয়ংক্রিয়ভাবে পুনরায় আঁকে।
  • @Binding — View এবং ডেটার মধ্যে দ্বি-মুখী সংযোগ, যা চাইল্ড View-কে প্যারেন্টের স্টেট পরিবর্তন করতে দেয়।
  • @ObservedObject এবং @StateObject — ObservableObject প্রোটোকল অনুসরণকারী ক্লাসের মাধ্যমে বাহ্যিক ডেটা মডেলের সাথে সংযোগ।

SwiftUI কী?

SwiftUI — Apple এর ডিক্লেয়ারেটিভ UI ফ্রেমওয়ার্ক, যা UIKit থেকে আমূল ভিন্ন। কন্ট্রোলার, ভিউ তৈরি এবং তাদের লাইফসাইকেল ম্যানুয়ালি পরিচালনা করার পরিবর্তে, ডেভেলপার ইন্টারফেসকে ডিক্লেয়ারেশন হিসেবে বর্ণনা করে: স্ক্রিনে কী থাকা উচিত, এটি কীভাবে তৈরি করতে হবে তা নয়। SwiftUI রিঅ্যাক্টিভিটির নীতির উপর ভিত্তি করে তৈরি: ইন্টারফেস স্টেটের একটি ফাংশন। স্টেট পরিবর্তিত হলে, SwiftUI স্বয়ংক্রিয়ভাবে সমস্ত নির্ভরশীল Views-এর body পুনঃগণনা করে এবং স্ক্রিনের শুধুমাত্র পরিবর্তিত অংশগুলি আপডেট করে। SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ এবং visionOS 1+ এ উপলব্ধ। SwiftUI কোড ক্রস-প্ল্যাটফর্ম: একটি ফাইল iPhone, iPad, Mac এবং Apple Watch-এ ন্যূনতম প্ল্যাটফর্ম অভিযোজন সহ কাজ করে। Apple WWDC Session 101 (2024) অনুসারে, SwiftUI App Store-এর 90% এরও বেশি স্ট্যান্ডার্ড UI প্যাটার্ন কভার করে।

SwiftUI বনাম UIKit

UIKit — ইম্পেরেটিভ ফ্রেমওয়ার্ক (2008): ডেভেলপার UIViewController তৈরি করে, viewDidLoad-এ subviews কনফিগার করে, UITableView-এর জন্য delegate/datasource ইমপ্লিমেন্ট করে এবং reloadData বা setNeedsLayout-এর মাধ্যমে স্ক্রিন আপডেট করে। SwiftUI কন্ট্রোলারকে সরল View স্ট্রাকচার, ডেলিগেটকে bindings এবং onChange, Auto Layout-কে HStack/VStack/ZStack এবং মডিফায়ার (padding, frame, offset) দিয়ে প্রতিস্থাপন করে। UIKit-এর ARC-এর মাধ্যমে ম্যানুয়াল মেমোরি ব্যবস্থাপনা প্রয়োজন; SwiftUI স্ট্রাকচার ব্যবহার করে যেগুলোর রেফারেন্স কাউন্টিং প্রয়োজন হয় না। SwiftUI-এর কর্মক্ষমতা UIKit-এর তুলনীয়: ফ্রেমওয়ার্কটি ন্যূনতম পরিবর্তন সেটের জন্য diffing অ্যালগরিদম ব্যবহার করে। IT Sectr-এ, iOS 17+ টার্গেট সহ নতুন প্রকল্পের জন্য SwiftUI ব্যবহৃত হয়; iOS 14–15 সমর্থনকারী প্রকল্পগুলির জন্য সীমিত SwiftUI সামঞ্জস্যের কারণে UIKit প্রয়োজন।

SwiftUI ডিক্লেয়ারেটিভ সিনট্যাক্স

SwiftUI-তে, ইন্টারফেস ViewBuilder — একটি result builder-এর মাধ্যমে বর্ণিত হয় যা Views-এর সেটকে tuple বা Group-এ রূপান্তর করে। মডিফায়ার (.padding(), .font(), .foregroundColor()) মূল অবজেক্ট পরিবর্তন না করে পরিবর্তিত সেটিংস সহ নতুন Views তৈরি করে। প্রতিটি মডিফায়ার একটি নতুন View রিটার্ন করে, যা চেইনিং সক্ষম করে। ViewBuilder if/else, switch, ForEach সমর্থন করে — পৃথক কন্ট্রোলার ছাড়াই শর্তসাপেক্ষ এবং চক্রীয় রেন্ডারিং। SwiftUI-তে View একটি value type (struct), যা পূর্বানুমেয় আচরণ নিশ্চিত করে এবং race conditions দূর করে।

View প্রোটোকল এবং computed property body

View — একটি প্রোটোকল যার একমাত্র প্রয়োজন: some View টাইপের computed property body। View অনুসরণকারী প্রতিটি স্ট্রাকচার body-তে স্ক্রিনের নিজস্ব অংশ বর্ণনা করে। some View টাইপটি একটি অস্বচ্ছ রিটার্ন টাইপ যা রিটার্ন করা View-এর কংক্রিট টাইপ লুকায় (VStack, HStack, ZStack, Text, Image ইত্যাদি স্ট্যাকিং)। Swift কম্পাইলার কম্পাইল টাইমে কংক্রিট টাইপ অনুমান করে, টাইপ ইরেজার ছাড়াই সরাসরি কলের কর্মক্ষমতা বজায় রাখে।

swift
import SwiftUI

struct GreetingView: View {
    var name: String
    
    var body: some View {
        VStack(spacing: 12) {
            Text("হ্যালো, \(name)!")
                .font(.largeTitle)
                .foregroundColor(.primary)
            
            Text("SwiftUI-তে স্বাগতম")
                .font(.body)
                .foregroundColor(.secondary)
        }
        .padding()
        .background(
            RoundedRectangle(cornerRadius: 12)
                .fill(.ultraThinMaterial)
        )
    }
}

GreetingView স্ট্রাকচার একটি name প্যারামিটার নেয় এবং একটি উল্লম্ব স্ট্যাকে দুটি টেক্সট ব্লক প্রদর্শন করে। মডিফায়ার .font, .foregroundColor, .padding এবং .background চেহারা কনফিগার করে। SwiftUI প্রতিবার ইনপুট প্যারামিটার (name) পরিবর্তিত হলে body কল করে — পুনরায় আঁকা শুধুমাত্র পরিবর্তিত অংশগুলির জন্য ঘটে। উদাহরণটি RoundedRectangle ব্যবহার করে .ultraThinMaterial সহ — SwiftUI-তে নির্মিত একটি নেটিভ ব্লার ব্যাকগ্রাউন্ড।

@State: SwiftUI-তে লোকাল স্টেট

@State — একটি property wrapper যা একক View-এর অন্তর্গত লোকাল স্টেট ঘোষণা করে। SwiftUI স্বয়ংক্রিয়ভাবে State মেমোরি পরিচালনা করে: মান পরিবর্তিত হলে body পুনরায় আঁকে, কিন্তু শুধুমাত্র সেই Views-গুলির জন্য যারা সেই State ব্যবহার করে। State সরল টাইপের (String, Int, Bool, enum) জন্য source of truth। জটিল ডেটা মডেলের জন্য @State ব্যবহার করবেন না — পরিবর্তে @StateObject এবং @ObservedObject ব্যবহার করুন। State প্রাইভেট হওয়া উচিত এবং View-এর ভিতরেই সংরক্ষিত হওয়া উচিত, কম্পোনেন্টের মধ্যে পাস করা উচিত নয়।

swift
import SwiftUI

struct CounterView: View {
    @State private var count = 0
    
    var body: some View {
        VStack(spacing: 20) {
            Text("গণনা: \(count)")
                .font(.system(size: 48, weight: .bold))
            
            Button(action: { count += 1 }) {
                Label("বৃদ্ধি", systemImage: "plus.circle")
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
    }
}

প্রাথমিক count মান = 0। প্রতিটি বাটন প্রেস count বৃদ্ধি করে; SwiftUI সম্পূর্ণ CounterView (সমস্ত Views) স্বয়ংক্রিয়ভাবে পুনরায় আঁকে। UIKit-এ, অনুরূপ দৃশ্যের জন্য IBOutlet, IBAction এবং ম্যানুয়াল label.text আপডেটের প্রয়োজন হতো। @State নিশ্চিত করে যে View শুধুমাত্র নির্দিষ্ট State পরিবর্তিত হলে পুনরায় আঁকে — SwiftUI-এর diffing অ্যালগরিদম ট্রিতে ন্যূনতম পরিবর্তন খুঁজে পায়।

@Binding: Views-এর মধ্যে দ্বি-মুখী যোগাযোগ

@Binding — একটি property wrapper যা View এবং সেই ডেটার মধ্যে দ্বি-মুখী সংযোগ তৈরি করে যার মালিক View নয়। Binding, State (বা অন্য source of truth)-এর একটি রেফারেন্স, যা চাইল্ড View-কে প্যারেন্টে সংরক্ষিত মান পড়তে এবং পরিবর্তন করতে দেয়। Binding $ উপসর্গ দ্বারা চিহ্নিত করা হয়: $count চাইল্ড View-এ Binding<Int> পাস করে। Binding ছাড়া, চাইল্ড View প্যারেন্টের ডেটা পরিবর্তন করতে পারে না — শুধু পড়তে পারে।

swift
import SwiftUI

struct StepperControl: View {
    @Binding var value: Int
    let range: ClosedRange<Int>
    
    var body: some View {
        HStack {
            Button(action: { if value > range.lowerBound { value -= 1 } }) {
                Image(systemName: "minus.circle")
            }
            Text("\(value)")
                .frame(minWidth: 40)
            Button(action: { if value < range.upperBound { value += 1 } }) {
                Image(systemName: "plus.circle")
            }
        }
    }
}

struct ParentView: View {
    @State private var quantity = 5
    
    var body: some View {
        StepperControl(value: $quantity, range: 1...10)
    }
}

ParentView State quantity-এর মালিক এবং $quantity-এর মাধ্যমে Binding পাস করে। StepperControl মান পরিবর্তন করতে পারে, এবং প্যারেন্টের quantity স্বয়ংক্রিয়ভাবে সিঙ্ক হয়। Binding ডেটার কপি নয়, বরং source of truth-এর একটি সেতু। কাস্টম কন্ট্রোল, এডিটর এবং পুনঃব্যবহারযোগ্য কম্পোনেন্টের জন্য @Binding ব্যবহার করুন যেগুলোর প্যারেন্টের ডেটা পরিবর্তন করার প্রয়োজন হয়।

@ObservedObject এবং @StateObject: বাহ্যিক ডেটা মডেল

@StateObject — ObservableObject অনুসরণকারী একটি ক্লাসের ইনস্ট্যান্স তৈরি এবং মালিকানার জন্য property wrapper। View লাইফসাইকেলে একবার অবজেক্ট তৈরি করে এবং এর @Published প্রপার্টি পরিবর্তিত হলে পুনরায় আঁকে। @ObservedObject — অনুরূপ wrapper, কিন্তু View অবজেক্টের মালিক নয় — অবজেক্ট View-এর বাইরে তৈরি এবং সংরক্ষিত হয় (ইনিশিয়ালাইজারের মাধ্যমে পাস করা হয়)। Apple View হায়ারার্কিতে source of truth-এর জন্য @StateObject এবং ডিপেন্ডেন্সি ইনজেকশনের জন্য @ObservedObject সুপারিশ করে।

swift
import SwiftUI
import Combine

class UserSettings: ObservableObject {
    @Published var username: String = "Guest"
    @Published var isLoggedIn = false
}

struct ProfileView: View {
    @StateObject private var settings = UserSettings()
    
    var body: some View {
        VStack {
            TextField("Username", text: $settings.username)
                .textFieldStyle(.roundedBorder)
            
            Toggle("Logged In", isOn: $settings.isLoggedIn)
            
            if settings.isLoggedIn {
                Text("\(settings.username), স্বাগতম!")
                    .font(.headline)
            }
        }
        .padding()
    }
}

UserSettings — দুটি @Published প্রপার্টি সহ একটি ObservableObject। ProfileView @StateObject-এর মাধ্যমে অবজেক্টের মালিক। username বা isLoggedIn-এর পরিবর্তন স্বয়ংক্রিয়ভাবে ProfileView পুনরায় আঁকে। @Published SwiftUI-কে পরিবর্তন সম্পর্কে জানাতে Combine Publisher ব্যবহার করে। চাইল্ড Views-এ settings পাস করতে @ObservedObject ব্যবহার করুন:

SwiftUI-তে Data Flow: সম্পূর্ণ চিত্র

Apple SwiftUI-তে Data Flow-এর চারটি স্তর সংজ্ঞায়িত করে: @State (লোকাল, value type), @Binding (দ্বি-মুখী), @StateObject/@ObservedObject (ObservableObject সহ reference type), @EnvironmentObject (গ্লোবাল, পরিবেশের মাধ্যমে ইনজেক্ট)। EnvironmentObject ইনিশিয়ালাইজারে স্পষ্ট পাসিং ছাড়াই সম্পূর্ণ View হায়ারার্কিতে ডেটা পাস করার অনুমতি দেয়। অতিরিক্তভাবে, @AppStorage UserDefaults-এর সাথে কাজ করে, @SceneStorage সিন স্টেটের সাথে, @FetchRequest Core Data-এর সাথে। Data Flow স্তরের পছন্দ অ্যাপ্লিকেশন আর্কিটেকচার নির্ধারণ করে: সরল স্ক্রিনগুলি State/Binding ব্যবহার করে, মডিউলারগুলি ObservedObject ব্যবহার করে, বড় আকারেরগুলি EnvironmentObject + Redux-সদৃশ সমাধান (TCA, Composable Architecture) ব্যবহার করে।

Property Wrapperমালিকানাটাইপকখন ব্যবহার করবেন
@StateলোকালValue (struct, enum)একক View-এর সরল স্টেট (কাউন্টার, টগল, টেক্সট ফিল্ড)
@Bindingবাহ্যিকState-এর রেফারেন্সচাইল্ড View প্যারেন্টের ডেটা পরিবর্তন করছে
@StateObjectView-এর মালিকানাReference (class)জটিল ডেটা মডেলের জন্য source of truth
@ObservedObjectইনজেকশনReference (class)View-এর বাইরে তৈরি মডেল (init-এর মাধ্যমে পাস)
@EnvironmentObjectগ্লোবালReference (class)সম্পূর্ণ হায়ারার্কির জন্য উপলব্ধ ডেটা (auth, theme)

প্রায়শই জিজ্ঞাসিত প্রশ্ন

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

@State — value types (struct, enum, String, Int) এবং একক View-এর লোকাল স্টেটের জন্য। SwiftUI স্বয়ংক্রিয়ভাবে State মেমোরি পরিচালনা করে। @StateObject — ObservableObject অনুসরণকারী reference types (class)-এর জন্য। @StateObject অবজেক্টের মালিক হয় এবং @Published প্রপার্টি পরিবর্তিত হলে View পুনরায় আঁকে। সরল কাউন্টারের জন্য @State ব্যবহার করুন; বিজনেস লজিকযুক্ত মডেলের জন্য @StateObject ব্যবহার করুন।

SwiftUI কি UIKit-এর সাথে ব্যবহার করা যায়?

হ্যাঁ, SwiftUI UIHostingController (UIKit-এর ভিতরে SwiftUI) এবং UIViewRepresentable (SwiftUI-এর ভিতরে UIKit)-এর মাধ্যমে UIKit-এর সাথে একীভূত হয়। UIHostingController একটি SwiftUI View-কে UIViewController-এ মোড়ানো করে। UIViewRepresentable SwiftUI-তে UIKit কম্পোনেন্ট (MKMapView, WKWebView) ব্যবহার করার অনুমতি দেয়। UIKit থেকে SwiftUI-তে প্রকল্প স্থানান্তরের জন্য এটি স্ট্যান্ডার্ড পদ্ধতি।

SwiftUI-তে ViewBuilder কী?

ViewBuilder — একটি result builder (Swift 5.1) যা Views-এর সেটকে TupleView, Group বা ConditionalContent টাইপের একক মানে রূপান্তর করে। ViewBuilder ডিক্লেয়ারেটিভ body-এর ভিতরে ইম্পেরেটিভ if/else এবং switch লেখার অনুমতি দেয়। ViewBuilder ছাড়া আপনাকে প্রতিটি শর্তসাপেক্ষ ব্লকের জন্য AnyView বা Group রিটার্ন করতে হতো। ViewBuilder-ই কারণ যে body-তে Views-এর মধ্যে কমা প্রয়োজন হয় না।

SwiftUI কি সমস্ত Apple ডিভাইসে কাজ করে?

হ্যাঁ, SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ এবং visionOS 1+ সমর্থন করে। তবে, কিছু API শুধুমাত্র নতুন সংস্করণে উপলব্ধ: উদাহরণস্বরূপ, navigationStack (iOS 16+), Observable macro (iOS 17+)। পশ্চাদগামী সামঞ্জস্যের জন্য #available এবং UIKit অভিযোজন ব্যবহার করুন।

SwiftUI অ্যাপ্লিকেশন কীভাবে ডিবাগ করবেন?

Xcode Debug View Hierarchy মডিফায়ার এবং ফ্রেম সহ SwiftUI View ট্রি দেখায়। SwiftUI Inspector টুল (Xcode ডান প্যানেল) রিয়েল টাইমে মডিফায়ার পরিবর্তন করার অনুমতি দেয়। body-তে self._printChanges() পুনরায় আঁকার কারণ লগ করে। SwiftUI টেমপ্লেট সহ Instruments View কর্মক্ষমতা ট্রেস করে এবং অতিরিক্ত পুনরায় আঁকা চিহ্নিত করে।

সারসংক্ষেপ

  • SwiftUI — Apple এর ডিক্লেয়ারেটিভ UI ফ্রেমওয়ার্ক, যেখানে ইন্টারফেস computed property body (2019) সহ View স্ট্রাকচার দ্বারা বর্ণিত হয়।
  • View — একটি value type (struct) যা View প্রোটোকল অনুসরণ করে; body ViewBuilder-এর মাধ্যমে some View রিটার্ন করে।
  • @State — value types-এর জন্য লোকাল স্টেট; পরিবর্তিত হলে View স্বয়ংক্রিয়ভাবে পুনরায় আঁকে।
  • @Binding — $ উপসর্গের মাধ্যমে দ্বি-মুখী সংযোগ; চাইল্ড View প্যারেন্টের ডেটা পরিবর্তন করে।
  • @StateObject / @ObservedObject — ObservableObject এবং @Published প্রপার্টি সহ reference types; StateObject অবজেক্টের মালিক, ObservedObject বাইরে থেকে গ্রহণ করে।
  • @EnvironmentObject — সম্পূর্ণ View হায়ারার্কির জন্য গ্লোবাল স্টেট; .environmentObject()-এর মাধ্যমে ইনজেক্ট করা হয়।
  • Data Flow SwiftUI-তে — State (লোকাল) থেকে Binding (দ্বি-মুখী) থেকে ObservedObject (মডিউলার) এবং EnvironmentObject (গ্লোবাল) পর্যন্ত।

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

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

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

আরও পড়ুন