মূল পয়েন্ট
View Protocol হল SwiftUI-এর কেন্দ্রীয় প্রোটোকল। এটির একটি মাত্র প্রপার্টি প্রয়োজন: var body: some View। body হল একটি computed property যা UI-এর বর্ণনা রিটার্ন করে। SwiftUI প্রতিটি অবস্থা পরিবর্তনে body-কে কল করে এবং GPU-তে ফলাফল রেন্ডার করে।
@ViewBuilder হল View-এর জন্য Result Builder। এটি return এবং TupleView ছাড়াই একটি ক্লোজারের ভিতরে একাধিক View লেখার অনুমতি দেয়। এটি if/else, switch, ForEach সমর্থন করে। সব কন্টেইনার (VStack, HStack, ZStack, Group) @ViewBuilder ব্যবহার করে। বিকল্প হল Group { … } লেআউট ছাড়াই গ্রুপিংয়ের জন্য। some View হল একটি Opaque Type। কম্পাইলার নির্দিষ্ট View টাইপ (Text, Button, VStack ইত্যাদি) জানে, কিন্তু বাহ্যিকভাবে এটি some View হিসেবে রিটার্ন করে। এটি সিগনেচার পরিবর্তন না করেই body-র টাইপ পরিবর্তনের অনুমতি দেয়। ViewModifier — View মডিফায়ার: .font(), .padding(), .background()। ViewModifier প্রোটোকল এবং .modifier()-এর মাধ্যমে কাস্টম মডিফায়ার।
// @ViewBuilder এবং NavigationStack-সহ View-এর উদাহরণ
struct ContentView: View {
@State private var items = ["Item 1", "Item 2"]
var body: some View {
NavigationStack {
List(items, id: .self) { item in
NavigationLink(item) {
DetailView(item: item)
}
}
.navigationTitle("Items")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Add") {
items.append("New Item")
}
}
}
}
}
}
// @StateObject-সহ DetailView
struct DetailView: View {
let item: String
@StateObject private var viewModel = DetailViewModel()
var body: some View {
Text(item)
.task {
await viewModel.loadDetails(for: item)
}
}
}NavigationStack (iOS 16+) — ডেটা-চালিত নেভিগেশন। একটি পাথ (হ্যাশেবল মানের অ্যারে) নেয় এবং navigationDestination-এর মাধ্যমে গন্তব্য প্রদর্শন করে। গন্তব্য ভিউ সহ NavigationLink-কে প্রতিস্থাপন করে। NavigationLink — স্ট্যাক নেভিগেট করার বোতাম। List — সেকশন, সোয়াইপ, মুছে ফেলা এবং ড্র্যাগ-এন্ড-ড্রপসহ উল্লম্ব তালিকা। Form — সেটিংসের জন্য বিশেষায়িত List: সেকশন, পিকার, টগল, টেক্সট ফিল্ড। Section — হেডার এবং ফুটারসহ List/Form-এ গ্রুপিং। ViewModifier — শৈলী পুনর্ব্যবহারের জন্য কাস্টম মডিফায়ার। .modifier(CustomModifier()) — প্রয়োগ।
List SwiftUI-তে UITableView-এর সমতুল্য। .onDelete, .onMove, .refreshable সমর্থন করে। SwipeActions — .swipeActions { Button("মুছুন", role: .destructive) { } }। Form — সেটিংসের জন্য অপ্টিমাইজড: DatePicker, Toggle, Stepper, Picker। হেডার/ফুটারসহ Section — গ্রুপিংয়ের জন্য। OutlineGroup — শ্রেণিবদ্ধ তালিকা (সেকশনসহ UITableView-এর সমতুল্য)। DisclosureGroup — বিষয়বস্তুসহ ভাঁজযোগ্য সেকশন। IT Sectr ডেটার জন্য List এবং সেটিংসের জন্য Form ব্যবহারের পরামর্শ দেয়।
PreviewProvider — Xcode Canvas-এ প্রিভিউর জন্য প্রোটোকল। Canvas — ইন্টারঅ্যাকটিভ SwiftUI প্রিভিউ (@main এবং Swift 5.9+ প্রয়োজন)। @ScaledMetric — Dynamic Type-এর সাথে স্কেল করা অভিযোজিত আকার।
Property Wrappers হলো SwiftUI-তে অবস্থা ব্যবস্থাপনার ভিত্তি। @State — স্থানীয় অবস্থা (value type)। @Binding — প্যারেন্ট অবস্থার সাথে সংযোগ। @StateObject — ObservableObject তৈরি করে। SwiftUI অবজেক্টের লাইফসাইকেল পরিচালনা করে। @ObservedObject — বাহ্যিক ObservableObject পর্যবেক্ষণ করে। @EnvironmentObject — পরিবেশ থেকে অবজেক্ট (.environmentObject()-এর মাধ্যমে ডিপেন্ডেন্সি ইনজেকশন)। @Environment — সিস্টেম মান (.colorScheme, .locale)। @AppStorage — UserDefaults। @FetchRequest — Core Data কোয়েরি। @FocusState — ইনপুট ফোকাস।
| র্যাপার | উদ্দেশ্য | মালিকানা |
|---|---|---|
| @State | স্থানীয় অবস্থা (value type) | View-এর মালিকানা |
| @Binding | প্যারেন্ট অবস্থার সাথে সংযোগ | প্যারেন্টের মালিকানা |
| @StateObject | ObservableObject তৈরি | View-এর মালিকানা |
| @ObservedObject | বাহ্যিক অবজেক্ট পর্যবেক্ষণ | বাহ্যিক মালিক |
| @EnvironmentObject | পরিবেশ থেকে অবজেক্ট | পূর্বপুরুষের মালিকানা |
| @Environment | সিস্টেম মান | সিস্টেম |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | ইনপুট ফোকাস | View-এর মালিকানা |
@StateObject বনাম @ObservedObject: @StateObject একটি অবজেক্ট তৈরি করে, @ObservedObject তা পর্যবেক্ষণ করে। শ্রেণিবিন্যাসে প্রথম মডেল তৈরির জন্য @StateObject ব্যবহার করুন, চাইল্ড ভিউতে পাস করার জন্য @ObservedObject। @FocusState — ফোকাস ব্যবস্থাপনা: .focused($field, equals: .email)। একাধিক ফিল্ডের জন্য enum সমর্থন করে।
@Environment — সিস্টেম মান: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext। কাস্টম Environment Values — EnvironmentKey-এর মাধ্যমে কাস্টম মান। ডিপেন্ডেন্সি ইনজেকশনের জন্য ব্যবহৃত: স্পষ্ট প্যারামিটার ছাড়াই সার্ভিস পাস করা। .environment() মডিফায়ার — শ্রেণিবিন্যাসে মান সেট করে। @EnvironmentObject — .environmentObject() থেকে ObservableObject। @Environment থেকে আলাদা কারণ এটি একটি রেফারেন্স টাইপ পাস করে। IT Sectr সিস্টেম মানের জন্য @Environment এবং সার্ভিসের জন্য @EnvironmentObject ব্যবহারের পরামর্শ দেয়।
.task{} — ভিউ প্রদর্শিত হলে অ্যাসিনক্রোনাস অপারেশন। অদৃশ্য হলে স্বয়ংক্রিয় বাতিল। async/await-এর জন্য .onAppear-কে প্রতিস্থাপন করে। .onAppear{} — প্রদর্শিত হলে সিনক্রোনাস অপারেশন। .onDisappear{} — অদৃশ্য হলে অপারেশন। .onChange(of:) — মান পরিবর্তনে প্রতিক্রিয়া। .onReceive(Publisher) — Combine পাবলিশারে প্রতিক্রিয়া। SwiftUI-তে View-এর লাইফসাইকেল: init → onAppear → body (রেন্ডারিং) → onDisappear। অবস্থা পরিবর্তনে: body → diff → পুনরায় রেন্ডার। IT Sectr অ্যাসিনক্রোনাস লোডিংয়ের জন্য .task এবং অ্যানালিটিক্সের জন্য .onAppear ব্যবহারের পরামর্শ দেয়।
.animation() — অ্যানিমেশন মডিফায়ার। .transition() — প্রদর্শিত/অদৃশ্য অ্যানিমেশন। withAnimation — স্পষ্ট অবস্থা পরিবর্তন অ্যানিমেশন। matchedGeometryEffect — ভিন্ন ভিউর মধ্যে অ্যানিমেশন (হিরো অ্যানিমেশন)। PhaseAnimator (iOS 17+) — enum-ভিত্তিক বহু-ফেজ অ্যানিমেশন। KeyframeAnimator (iOS 17+) — কীফ্রেমসহ ফ্রেম-বাই-ফ্রেম অ্যানিমেশন। SwiftUI অ্যানিমেশন Core Animation-এর মাধ্যমে GPU-তে চলে। IT Sectr প্রাকৃতিক অ্যানিমেশনের জন্য .spring() এবং ফিজিক্যাল এফেক্টের জন্য .interpolatingSpring ব্যবহারের পরামর্শ দেয়।
ObservableObject — @Published প্রপার্টিসহ অবজেক্টের জন্য প্রোটোকল। SwiftUI objectWillChange পাবলিশারে সাবস্ক্রাইব করে। @Published — প্রপার্টি পরিবর্তন প্রকাশ করে। @StateObject — ObservableObject তৈরি করে, লাইফসাইকেল পরিচালনা করে। @ObservedObject — বাহ্যিক পর্যবেক্ষণ করে। Combine — রিয়েক্টিভ প্রোগ্রামিংয়ের ফ্রেমওয়ার্ক। @EnvironmentObject — পরিবেশের মাধ্যমে DI। .environmentObject() সেট করে, @EnvironmentObject পড়ে। MVVM — স্ট্যান্ডার্ড আর্কিটেকচার: View (SwiftUI) — ViewModel (ObservableObject) — Model। IT Sectr প্রধান ViewModels-এর জন্য MVVM + @StateObject ব্যবহারের পরামর্শ দেয়।
class UserViewModel: ObservableObject {
@Published var users: [User] = []
@Published var isLoading = false
func loadUsers() async {
isLoading = true
defer { isLoading = false }
do {
users = try await api.fetchUsers()
} catch {
print("ত্রুটি: \(error)")
}
}
}
struct UsersView: View {
@StateObject private var viewModel = UserViewModel()
var body: some View {
List(viewModel.users, id: \.id) { user in
Text(user.name)
}
.task { await viewModel.loadUsers() }
.overlay {
if viewModel.isLoading { ProgressView() }
}
}
}অ্যাক্সেসিবিলিটি SwiftUI-তে: .accessibilityLabel(), .accessibilityHint(), .accessibilityValue(), .accessibilityAddTraits()। VoiceOver অ্যাক্সেসিবিলিটি লেবেল পড়ে। Dynamic Type — @ScaledMetric, @DynamicProperty। স্থানীয়করণ: String(localized:) (SwiftUI + String Catalog)। LocalizedStringKey — স্বয়ংক্রিয় অনুবাদ। বহুবচন নিয়ম — String Catalog-এর মাধ্যমে (one, few, many, other)। ডান-থেকে-বাম (আরবি, হিব্রু) — স্বয়ংক্রিয়ভাবে সমর্থিত। .environment(.layoutDirection, .rightToLeft)। IT Sectr সব ইন্টারঅ্যাকটিভ উপাদানের জন্য অ্যাক্সেসিবিলিটি লেবেল ব্যবহারের পরামর্শ দেয়।
struct AccessibleButton: View {
let action: () -> Void
var body: some View {
Button(action: action) {
Label("Settings", systemImage: "gear")
}
.accessibilityLabel("Open Settings")
.accessibilityHint("Double tap to navigate to settings screen")
.accessibilityAddTraits(.isButton)
}
}
// Dynamic Type সমর্থন
struct ScalableText: View {
@ScaledMetric private var fontSize: CGFloat = 17
var body: some View {
Text("Hello, World!")
.font(.system(size: fontSize))
}
}Swift Charts (iOS 16+) — চার্ট তৈরির ফ্রেমওয়ার্ক। Chart { } — বেসিক কন্টেইনার। BarMark, LineMark, PointMark, AreaMark, RuleMark — মার্ক। ডেটার জন্য ForEach। ChartAxis — অক্ষ কাস্টমাইজেশন। .chartXAxis, .chartYAxis। ChartLegend — লেজেন্ড। ইন্টারপোলেশন — catmullRom, linear, step। অ্যানিমেশন — Chart-এর জন্য .animation()। IT Sectr বিল্ট-ইন চার্টের জন্য Swift Charts এবং জটিল চার্টের জন্য Charts (DGCharts) ব্যবহারের পরামর্শ দেয়।
import Charts
struct MonthlySales: Identifiable {
let id = UUID()
let month: String
let sales: Double
}
struct SalesChart: View {
let data: [MonthlySales]
var body: some View {
Chart(data) { item in
BarMark(
x: .value("Month", item.month),
y: .value("Sales", item.sales)
)
.foregroundStyle(.blue.gradient)
}
.chartXAxisLabel("Month")
.chartYAxisLabel("Sales")
.frame(height: 200)
.padding()
}
}Swift Package Manager (SPM) — Apple-এর ডিপেন্ডেন্সি ম্যানেজার। Xcode-এ সংহত। সমর্থন করে: বাইনারি প্যাকেজ, রিসোর্স, টেস্ট, swift-6 কঠোর কনকারেন্সি। semver ট্যাগসহ GitHub-এর মাধ্যমে প্যাকেজ প্রকাশ। SPM CocoaPods এবং Carthage-কে প্রতিস্থাপন করে Swift ডিপেন্ডেন্সির ডি-ফ্যাক্টো স্ট্যান্ডার্ড। IT Sectr সব নতুন প্রকল্পের জন্য SPM ব্যবহারের পরামর্শ দেয়।
Swift Concurrency (async/await, TaskGroup, AsyncSequence) — async/await Swift 5.5+-এ নির্মিত। Task — অ্যাসিনক্রোনিসিটির ইউনিট। TaskGroup — সমান্তরাল কাজ। AsyncSequence — অ্যাসিনক্রোনাস সিকোয়েন্স (AsyncStream, AsyncAlgorithms)। Task Local Values — Task-এর জন্য প্রাসঙ্গিক ডেটা। Swift Concurrency অ্যাসিনক্রোনাস অপারেশনের জন্য Combine-কে সম্পূর্ণরূপে প্রতিস্থাপন করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
View Protocol বেস প্রোটোকল। var body: some View প্রয়োজন। body হল GPU-তে রেন্ডার করা UI বর্ণনা।
@ViewBuilder একাধিক View-এর জন্য Result Builder। কন্টেইনারে if/else, switch, ForEach ব্যবহারের অনুমতি দেয়।
@StateObject একটি অবজেক্ট তৈরি করে। @ObservedObject বিদ্যমানটি পর্যবেক্ষণ করে। শ্রেণিবিন্যাসে প্রথম তৈরি করার জন্য @StateObject।
NavigationStack — ডেটা-চালিত নেভিগেশন। পাথ-ভিত্তিক, ডিপ লিংকিং। NavigationView-কে প্রতিস্থাপন করে।
@FocusState — ইনপুট ফোকাস ব্যবস্থাপনা। .focused() মডিফায়ার। একাধিক ফিল্ডের জন্য enum সমর্থন করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।