SwiftUI হল Apple-এর একটি ডিক্লেয়ারেটিভ ফ্রেমওয়ার্ক যা ইকোসিস্টেমের সব প্ল্যাটফর্মে ইউজার ইন্টারফেস তৈরির জন্য। ধাপে ধাপে ইম্পেরেটিভ বর্ণনার পরিবর্তে, ডেভেলপার ঘোষণা করে যে ইন্টারফেসটি কেমন দেখতে হবে, এবং SwiftUI তার রেন্ডারিং এবং আপডেট পরিচালনা করে। Apple Developer Documentation (2025) অনুযায়ী, SwiftUI iOS 15+, iPadOS 15+, macOS 12+, watchOS 8+ এবং tvOS 15+ সমর্থন করে এবং সব ইন্টারফেস কম্পোনেন্টের জন্য মৌলিক বিল্ডিং ব্লক হিসেবে View Protocol ব্যবহার করে।
মূল বিষয়
body প্রপার্টি সহ যেকোনো SwiftUI UI কম্পোনেন্টের ভিত্তি, যা ভিউ কম্পোজিশনের মাধ্যমে স্ক্রিনের বিবরণ ফেরত দেয়।SwiftUI একটি ডিক্লেয়ারেটিভ ফ্রেমওয়ার্ক যা Apple 2019 সালে নতুন প্রকল্পে UIKit প্রতিস্থাপনের জন্য প্রবর্তন করে। ম্যানুয়ালি UIView ইনস্ট্যান্স তৈরি এবং সেগুলোকে হায়ারার্কিতে যোগ করার পরিবর্তে, ডেভেলপার View প্রোটোকল অনুসরণকারী স্ট্রাকচারের মাধ্যমে ইন্টারফেস বর্ণনা করে। SwiftUI স্বয়ংক্রিয়ভাবে বর্তমান এবং নতুন অবস্থার মধ্যে পার্থক্য গণনা করে এবং তার নিজস্ব রেন্ডারিং ইঞ্জিন ব্যবহার করে শুধুমাত্র পরিবর্তিত অংশগুলি পুনরায় রেন্ডার করে।
ফ্রেমওয়ার্কটি Swift-এ ভ্যালু সিম্যান্টিক্স (স্ট্রাকচার, ক্লাস নয়) ব্যবহার করে লেখা, যা UI কম্পোনেন্টকে হালকা এবং থ্রেড-সেফ করে। UIKit-এর বিপরীতে, যেখানে Objective-C রানটাইমের কারণে UIViewController 200+ বাইট হতে পারে, SwiftUI View হল কয়েক বাইটের একটি সাধারণ স্ট্রাকচার। এটি সীমিত মেমরির watchOS-এর জন্য বিশেষভাবে গুরুত্বপূর্ণ।
একই View বিবরণ iPhone, iPad, Mac, Apple Watch, Apple TV এবং Apple Vision Pro-তে কাজ করে। SwiftUI প্ল্যাটফর্ম অনুযায়ী ইন্টারফেস অভিযোজিত করে: iOS-এ টাচ জেসচার, macOS-এ কীবোর্ড কম্বিনেশন, watchOS-এ Digital Crown স্ক্রলিং। এটি একাধিক Apple প্ল্যাটফর্মে অ্যাপ প্রকাশকারী কোম্পানিগুলির উন্নয়নের সময় হ্রাস করে, তবে প্রতিটি প্ল্যাটফর্মের নির্দিষ্ট উপাদানের জন্য অতিরিক্ত কনফিগারেশন প্রয়োজন।
SwiftUI-তে, প্রতিটি স্ক্রিন একটি স্ট্রাকচার যা View প্রোটোকল বাস্তবায়ন করে একটি মাত্র প্রয়োজনীয়তা সহ: some View টাইপের একটি গণনাকৃত প্রপার্টি body। some কীওয়ার্ড (অস্বচ্ছ টাইপ) ভিউয়ের কংক্রিট টাইপ লুকিয়ে রাখে, যা SwiftUI-কে রেন্ডারিং অপ্টিমাইজ করতে দেয়। body-এর ভিতরে, ডেভেলপার ViewBuilder ব্যবহার করে তৈরি কম্পোনেন্ট — Text, Image, Button, List — একত্রিত করে, যা একাধিক ভিউকে একটিতে সংগ্রহ করে।
struct GreetingView: View {
let name: String
var var body: some View {
VStack {
Text("হ্যালো, \(name)!")
.font(.title)
.foregroundColor(.blue)
Image(systemName: "hand.wave")
.imageScale(.large)
}
.padding()
}
}
উদাহরণে, VStack (উল্লম্ব স্ট্যাক)-এ Text এবং Image রয়েছে। name মান স্ট্রাকচারের ইনিশিয়ালাইজারের মাধ্যমে পাস করা হয় — এইভাবে SwiftUI-তে বাহ্যিক DI কন্টেইনার ছাড়াই DI (ডিপেন্ডেন্সি ইনজেকশন) কাজ করে। প্রতিটি মডিফায়ার মূলকে পরিবর্তন না করে, প্রয়োগকৃত পরিবর্তন সহ একটি নতুন ভিউ ফেরত দেয়। এটি ভ্যালু টাইপের অপরিবর্তনীয়তার কারণে সম্ভব।
ViewBuilder একটি রেজাল্ট বিল্ডার যা @resultBuilder দ্বারা অ্যানোটেটেড, যা ১০টি ভিউকে একটিতে সংগ্রহ করে। body-এর ভিতরে অতিরিক্ত র্যাপার ছাড়া if/else, switch এবং ForEach ব্যবহার করা যেতে পারে। ForEach Identifiable উপাদানের সাথে কাজ করে — সন্নিবেশ/মুছে ফেলার সময় সঠিক অ্যানিমেশনের জন্য প্রতিটি ভিউকে একটি অনন্য id দেওয়া হয়।
SwiftUI-তে, অবস্থা নির্ধারণ করে স্ক্রিনে কী কন্টেন্ট প্রদর্শিত হবে। যখন অবস্থা পরিবর্তিত হয়, SwiftUI নির্ভরশীল ভিউয়ের body পুনরায় তৈরি করে এবং ডিফ অ্যালগরিদম ব্যবহার করে আগেরটির সাথে ফলাফল তুলনা করে। অবস্থা সংরক্ষণের জন্য প্রপার্টি র্যাপার ব্যবহার করা হয় — প্রতিটি তার নির্দিষ্ট কাজ সমাধান করে: স্থানীয় অবস্থা, চাইল্ড ভিউয়ের সাথে সংযোগ, বা বাহ্যিক ডেটা মডেল।
struct CounterView: View {
@State private var count = 0
var var body: some View {
VStack {
Text("কাউন্টার: \(count)")
Button("বৃদ্ধি") {
count += 1
}
}
}
}
class UserViewModel: ObservableObject {
@Published var name = ""
@Published var age = 0
}
@State View স্ট্রাকচারের ভিতরে একটি স্থানীয় সরল মান (Int, String, Bool) সংরক্ষণ করে। SwiftUI মেমরি স্ট্রাকচার থেকে আলাদা স্টোরেজে সরিয়ে নেয় — তাই @State-যুক্ত প্রপার্টি পরিবর্তন করা যেতে পারে, এমনকি View ভ্যালু টাইপ হলেও। @ObservableObject @Published প্রপার্টি সহ ক্লাসের জন্য, যাদের পরিবর্তন SwiftUI-কে পুনরায় রেন্ডার করার প্রয়োজনীয়তা সম্পর্কে স্বয়ংক্রিয়ভাবে জানায়।
@Binding প্যারেন্ট ভিউতে অবস্থিত ডেটা উৎসের সাথে দ্বিমুখী সংযোগ তৈরি করে। প্যারেন্ট $variable (প্রজেক্টেড ভ্যালু) পাস করে, এবং চাইল্ড বাইন্ডিংয়ের মাধ্যমে মান পড়ে এবং লেখে। এটি প্যারেন্টে অবস্থা রেখে টেক্সট ইনপুট বা টগলকে আলাদা কম্পোনেন্টে সরানোর অনুমতি দেয়। @Binding ছাড়া, প্রতিটি পরিবর্তনের জন্য নতুন মান উপরে পাঠাতে কলব্যাক ক্লোজারের প্রয়োজন হবে।
iOS 16-এর আগে, SwiftUI-তে নেভিগেশন NavigationView-এর উপর নির্মিত ছিল — iPad-এ জটিল আচরণ (স্প্লিট ভিউ, ডাবল কলাম) সহ একটি লিগ্যাসি API। iOS 16 থেকে শুরু করে, Apple NavigationStack সুপারিশ করে — টাইপ-সেফ রুট সহ একটি সরলীকৃত বিকল্প। ডেভেলপার সম্ভাব্য রুটের একটি এনাম সংজ্ঞায়িত করে, এবং NavigationStack ডিপ লিংক এবং রুটে ফিরে আসার সমর্থন সহ স্বয়ংক্রিয়ভাবে স্ক্রিন স্ট্যাক পরিচালনা করে।
enum Route: Hashable {
case detail(id: Int)
case settings
}
struct ContentView: View {
var var body: some View {
NavigationStack {
List {
NavigationLink("বিবরণ স্ক্রিন",
value: Route.detail(id: 42))
NavigationLink("সেটিংস",
value: Route.settings)
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
case .settings: SettingsView()
}
}
}
}
}
Hashable-এর সাথে সঙ্গতিপূর্ণ রুট প্যারামিটার পাস করার জন্য যেকোনো ডেটা টাইপ ব্যবহার করার অনুমতি দেয়। navigationDestination(for:destination:) রুট টাইপকে টার্গেট ভিউয়ের সাথে সংযুক্ত করে। UIKit নেভিগেশনের তুলনায় সুবিধা হল নতুন রুট যোগ করার সময় পুনরায় রেন্ডারিংয়ের প্রয়োজন নেই: শুধু এনামে একটি কেস এবং সুইচে একটি হ্যান্ডলার যোগ করুন। ডিপ লিংক NavigationStack-এ processDeepLink-এর মাধ্যমে পরিচালিত হয়।
প্রোগ্রামেটিক নেভিগেশনের (লগইন, টাইমার বা সার্ভার রেসপন্সের পরে) জন্য, NavigationLink ইনিশিয়ালাইজারের সাথে @State ব্যবহার করা হয়: NavigationLink(isActive: $isActive)। যখন isActive = true হয়, ব্যবহারকারীর স্পর্শ ছাড়াই ট্রানজিশন ঘটে। একটি বিকল্প হল NavigationStack-এ $path অ্যারে বাইন্ড করা: $path.append(Route.detail(id: 1))।
Modifier একটি পদ্ধতি যা ভিউয়ের একটি পরিবর্তিত কপি ফেরত দেয়। UIKit-এর বিপরীতে, যেখানে প্রপার্টি কনফিগারেশন বিদ্যমান ভিউ পরিবর্তন করে করা হয়, SwiftUI প্রয়োগকৃত পরিবর্তন সহ একটি নতুন মান তৈরি করে। মডিফায়ার চেইনিং অনুক্রমিক রূপান্তর থেকে চূড়ান্ত ইন্টারফেস তৈরি করে: ফন্ট → প্যাডিং → রঙ → ছায়া → জেসচার।
Apple ২০০টিরও বেশি বিল্ট-ইন মডিফায়ার প্রদান করে। সবচেয়ে সাধারণ: .font(), .foregroundColor(), .padding(), .background(), .cornerRadius(), .shadow(), .opacity(), .offset()। মডিফায়ারের ক্রম গুরুত্বপূর্ণ: .padding() আগে .background() প্যাডিং সহ এলাকা পূর্ণ করে, পরে — শুধুমাত্র অভ্যন্তরীণ এলাকা। কাস্টম মডিফায়ার ViewModifier প্রোটোকলের মাধ্যমে তৈরি করা হয়।
মডিফায়ার টার্নারি অপারেটরের মাধ্যমে শর্তসাপেক্ষে প্রয়োগ করা যেতে পারে: .foregroundColor(isError ? .red : .primary)। অ্যানিমেশনের জন্য .animation(.easeInOut, value: state) ব্যবহার করা হয় — অ্যানিমেশন মডিফায়ার একটি নির্দিষ্ট অবস্থা প্রপার্টির সাথে বাঁধা থাকে। যখন এই প্রপার্টি পরিবর্তিত হয়, SwiftUI পুরনো এবং নতুন মানের মধ্যে ট্রানজিশন অ্যানিমেট করে। অ্যানিমেশন opacity, offset, scale, rotation, আকার এবং রঙের সাথে কাজ করে — প্রতিটি প্রপার্টির একটি সংশ্লিষ্ট AnimatableParameter আছে।
কাস্টম অ্যানিমেশনের জন্য, .transition (আবির্ভাব/অদৃশ্য হওয়া) এবং .matchedGeometryEffect (দুটি কন্টেইনারের মধ্যে একটি উপাদানের মসৃণ স্থানান্তর) উপলব্ধ। পরেরটি তালিকায় হিরো অ্যানিমেশনের জন্য ব্যবহৃত হয়: তালিকা সেলে একটি আইকন মসৃণভাবে বিস্তারিত স্ক্রিনে একটি বড় ছবিতে রূপান্তরিত হয়।
SwiftUI এবং UIKit-এর মধ্যে পছন্দ iOS ডেভেলপারের প্রথম দ্বিধাগুলির মধ্যে একটি। উভয় ফ্রেমওয়ার্ক Apple দ্বারা সমর্থিত কিন্তু ইন্টারফেস নির্মাণের সমস্যা মৌলিকভাবে ভিন্ন উপায়ে সমাধান করে: SwiftUI ডিক্লেয়ারেটিভভাবে, UIKit ইম্পেরেটিভভাবে। পার্থক্য অবস্থা ব্যবস্থাপনা, নেভিগেশন, কর্মক্ষমতা এবং সামঞ্জস্যে প্রকাশ পায়।
| দিক | SwiftUI | UIKit |
|---|---|---|
| পদ্ধতি | ডিক্লেয়ারেটিভ: কী দেখাতে হবে | ইম্পেরেটিভ: কীভাবে তৈরি করতে হবে |
| অবস্থা | Property Wrappers, স্বয়ংক্রিয় পুনরায় রেন্ডারিং | ম্যানুয়াল: reloadData, setNeedsLayout |
| UI কোড | কমপ্যাক্ট, মডিফায়ার চেইন | বিশদ, NSCoder/Storyboard/সীমাবদ্ধতা |
| কর্মক্ষমতা | iOS 17+ এ উচ্চ, ডিফ অ্যালগরিদম | iOS 12–16 এ শীর্ষ, প্রত্যক্ষ নিয়ন্ত্রণ |
| ন্যূনতম সংস্করণ | iOS 15+ (পূর্ণ সমর্থন) | iOS 2+ (সব সংস্করণ) |
ন্যূনতম iOS 17 সংস্করণ সহ নতুন প্রকল্পের জন্য, Apple SwiftUI-কে প্রাথমিক ফ্রেমওয়ার্ক হিসেবে সুপারিশ করে। UIKit রেন্ডারিং-এর উপর সূক্ষ্ম নিয়ন্ত্রণ (কাস্টম UICollectionViewLayout, জটিল CAAnimation দৃশ্য) বা iOS 12–14 সমর্থন প্রয়োজন এমন ইন্টারফেসের জন্য প্রয়োজনীয় রয়ে গেছে। অনেক প্রকল্প একটি হাইব্রিড পদ্ধতি ব্যবহার করে: UIHostingController-এর মাধ্যমে SwiftUI একটি UIKit অ্যাপে এম্বেড করা হয়, এবং UIViewRepresentable SwiftUI হায়ারার্কির ভিতরে UIKit কম্পোনেন্ট ব্যবহার করার অনুমতি দেয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, UIHostingController (SwiftUI in UIKit) এবং UIViewRepresentable (UIKit in SwiftUI)-এর মাধ্যমে। এটি একটি হাইব্রিড পদ্ধতি, মাইগ্রেশনের সময় জনপ্রিয়।
iOS 17 পূর্ণ কার্যকারিতা প্রদান করে: NavigationStack, Observation framework, Swift Charts। iOS 15 প্রোডাকশনের জন্য ন্যূনতম সীমা।
সবচেয়ে সাধারণ কারণ ব্যাকগ্রাউন্ড থ্রেডে @Published প্রপার্টি পরিবর্তন করা। ObservableObject-কে main actor-এ পরিবর্তন পাঠাতে হবে: @MainActor class ViewModel।
.debounce ব্যবহার করুন Combine-এর মাধ্যমে: Button.publisher(for: .tap) .debounce(for: .seconds(0.3), scheduler: RunLoop.main)।
হ্যাঁ, Gesture মডিফায়ারের মাধ্যমে: DragGesture, LongPressGesture, MagnificationGesture, RotationGesture। .simultaneousGesture() এবং .sequenced() ব্যবহার করে একত্রিত করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন