نکات کلیدی
View Protocol پروتکل مرکزی SwiftUI است. فقط یک ویژگی نیاز دارد: var body: some View. body یک ویژگی محاسبهشده است که توضیحات UI را برمیگرداند. SwiftUI با هر تغییر حالت body را فراخوانی کرده و نتیجه را روی GPU رندر میکند.
@ViewBuilder یک Result Builder برای Viewها است. اجازه میدهد چندین View درون یک closure بدون return و بدون TupleView بنویسید. از 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 protocol و .modifier().
// مثال View با @ViewBuilder و NavigationStack
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")
}
}
}
}
}
}
// DetailView با @StateObject
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 با header/footer — برای گروهبندی. OutlineGroup — لیستهای سلسلهمراتبی (معادل UITableView با بخشها). DisclosureGroup — بخش جمعشدنی با محتوا. IT Sectr برای دادهها List و برای تنظیمات Form را توصیه میکند.
PreviewProvider — پروتکل برای پیشنمایش در Xcode Canvas. Canvas — پیشنمایش تعاملی SwiftUI (نیاز به @main و Swift 5.9+). @ScaledMetric — اندازه تطبیقی که با Dynamic Type مقیاس میشود.
Property Wrappers اساس مدیریت حالت در SwiftUI هستند. @State — حالت محلی (نوع مقدار). @Binding — اتصال به حالت والد. @StateObject — ObservableObject ایجاد میکند. SwiftUI چرخه حیات شیء را مدیریت میکند. @ObservedObject — ObservableObject خارجی را مشاهده میکند. @EnvironmentObject — شیء از محیط (تزریق وابستگی از طریق .environmentObject()). @Environment — مقادیر سیستم (.colorScheme، .locale). @AppStorage — UserDefaults. @FetchRequest — پرسوجوی Core Data. @FocusState — فوکوس ورودی.
| لفافکننده | هدف | مالکیت |
|---|---|---|
| @State | حالت محلی (نوع مقدار) | 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. مقادیر محیط سفارشی — مقدار سفارشی از طریق EnvironmentKey. برای تزریق وابستگی استفاده میشود: ارسال سرویسها بدون پارامترهای صریح. تغییردهنده .environment() — مقدار را در سلسلهمراتب تنظیم میکند. @EnvironmentObject — ObservableObject از .environmentObject(). با @Environment تفاوت دارد زیرا نوع مرجع را ارسال میکند. IT Sectr برای مقادیر سیستم @Environment و برای سرویسها @EnvironmentObject را توصیه میکند.
.task{} — عملیات ناهمگام هنگام ظهور نما. لغو خودکار هنگام ناپدید شدن. جایگزین .onAppear برای async/await. .onAppear{} — عملیات همگام هنگام ظهور. .onDisappear{} — عملیات هنگام ناپدید شدن. .onChange(of:) — واکنش به تغییرات مقدار. .onReceive(Publisher) — واکنش به ناشر Combine. چرخه حیات View در SwiftUI: init → onAppear → body (رندر) → onDisappear. هنگام تغییر حالت: body → diff → رندر مجدد. IT Sectr برای بارگذاری ناهمگام .task و برای تحلیل .onAppear را توصیه میکند.
.animation() — تغییردهنده انیمیشن. .transition() — انیمیشن ظهور/ناپدید شدن. withAnimation — انیمیشن صریح تغییر حالت. matchedGeometryEffect — انیمیشن بین نماهای مختلف (hero animation). PhaseAnimator (iOS 17+) — انیمیشن چندمرحلهای مبتنی بر enum. KeyframeAnimator (iOS 17+) — انیمیشن فریم به فریم با keyframeها. انیمیشنهای SwiftUI از طریق Core Animation روی GPU اجرا میشوند. IT Sectr برای انیمیشنهای طبیعی .spring() و برای اثرات فیزیکی .interpolatingSpring را توصیه میکند.
ObservableObject — پروتکل برای اشیاء با ویژگیهای @Published. SwiftUI در ناشر objectWillChange مشترک میشود. @Published — تغییرات ویژگی را منتشر میکند. @StateObject — ObservableObject ایجاد میکند، چرخه حیات را مدیریت میکند. @ObservedObject — خارجی را مشاهده میکند. Combine — چارچوب برنامهنویسی واکنشی. @EnvironmentObject — تزریق وابستگی از طریق محیط. .environmentObject() تنظیم میکند، @EnvironmentObject میخواند. MVVM — معماری استاندارد: View (SwiftUI) — ViewModel (ObservableObject) — Model. IT Sectr برای ViewModelهای اصلی 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. انیمیشن — .animation() برای Chart. 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) — مدیر وابستگی اپل. یکپارچه با Xcode. پشتیبانی از: بستههای باینری، منابع، تستها، همروندی strict swift-6. انتشار بسته از طریق GitHub با برچسب semver. SPM استاندارد دوفاکتو برای وابستگیهای Swift است که جایگزین CocoaPods و Carthage میشود. 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 توضیحات UI است که روی GPU رندر میشود.
@ViewBuilder یک Result Builder برای چندین View است. امکان if/else، switch، ForEach در کانتینرها را فراهم میکند.
@StateObject یک شیء ایجاد میکند. @ObservedObject یک شیء موجود را مشاهده میکند. @StateObject برای اولین ایجاد در سلسلهمراتب.
NavigationStack — ناوبری مبتنی بر داده. مسیر-محور، deep linking. جایگزین NavigationView.
@FocusState — مدیریت فوکوس ورودی. تغییردهنده .focused(). پشتیبانی از enum برای چندین فیلد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.