SwiftUI در توسعه موبایل: چیست، مفاهیم کلیدی و نحوه کار

نویسنده: IT Sectr منتشر شده: 2026-07-02 زمان مطالعه: 10 دقیقه
SwiftUI چارچوب اعلامی اپل برای ساخت رابط‌های کاربری در تمام پلتفرم‌ها است. طبق Apple SwiftUI Docs (2025)، از SwiftUI در 70% برنامه‌های جدید در App Store استفاده می‌شود. درک مفاهیم کلیدی SwiftUI — View Protocol، @ViewBuilder، NavigationStack — پایه توسعه مدرن iOS است.

نکات کلیدی

  • View Protocol — var body: some View. هر View یک ساختار منطبق بر پروتکل View است. body توضیحات UI است.
  • @ViewBuilder — Result Builder برای چندین View در کانتینرها. if/else، switch، ForEach درون body.
  • NavigationStack (iOS 16+) — ناوبری مبتنی بر داده. مسیر-محور، deep linking. جایگزین NavigationView.
  • @StateObject — مالکیت شیء. @ObservedObject — مشاهده. @EnvironmentObject — محیط.
  • @FocusState — مدیریت فوکوس. .task{}، .onAppear{} — چرخه حیات. PreviewProvider — پیش‌نمایش.

مبانی (View Protocol، body، some View، @ViewBuilder)

View Protocol پروتکل مرکزی SwiftUI است. فقط یک ویژگی نیاز دارد: var body: some View. body یک ویژگی محاسبه‌شده است که توضیحات UI را برمی‌گرداند. SwiftUI با هر تغییر حالت body را فراخوانی کرده و نتیجه را روی GPU رندر می‌کند.

@ViewBuilder

@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().

swift
// مثال 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)
            }
    }
}

تغییردهنده‌ها و کانتینرها (ViewModifier، NavigationStack، List، Form)

NavigationStack (iOS 16+) — ناوبری مبتنی بر داده. یک مسیر (آرایه‌ای از مقادیر قابل هش) دریافت کرده و مقصد را از طریق navigationDestination نمایش می‌دهد. جایگزین NavigationLink با نماهای مقصد. NavigationLink — دکمه برای ناوبری در پشته. List — لیست عمودی با بخش‌ها، کشیدن، حذف و کشیدن و رها کردن. Form — یک List تخصصی برای تنظیمات: بخش‌ها، انتخابگرها، کلیدها، فیلدهای متنی. Section — گروه‌بندی در List/Form با سرصفحه و پاصفحه. ViewModifier — تغییردهنده‌های سفارشی برای استفاده مجدد از سبک‌ها. .modifier(CustomModifier()) — اعمال.

List و Form به تفصیل

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 مقیاس می‌شود.

مدیریت حالت (@StateObject، @ObservedObject، @EnvironmentObject، @FocusState)

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ایجاد ObservableObjectView مالک است
@ObservedObjectمشاهده شیء خارجیمالک خارجی
@EnvironmentObjectشیء از محیطجد مالک است
@Environmentمقدار سیستمسیستم
@AppStorageUserDefaultsUserDefaults
@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، .onDisappear)

.task{} — عملیات ناهمگام هنگام ظهور نما. لغو خودکار هنگام ناپدید شدن. جایگزین .onAppear برای async/await. .onAppear{} — عملیات همگام هنگام ظهور. .onDisappear{} — عملیات هنگام ناپدید شدن. .onChange(of:) — واکنش به تغییرات مقدار. .onReceive(Publisher) — واکنش به ناشر Combine. چرخه حیات View در SwiftUI: init → onAppear → body (رندر) → onDisappear. هنگام تغییر حالت: body → diff → رندر مجدد. IT Sectr برای بارگذاری ناهمگام .task و برای تحلیل .onAppear را توصیه می‌کند.

انیمیشن در SwiftUI

.animation() — تغییردهنده انیمیشن. .transition() — انیمیشن ظهور/ناپدید شدن. withAnimation — انیمیشن صریح تغییر حالت. matchedGeometryEffect — انیمیشن بین نماهای مختلف (hero animation). PhaseAnimator (iOS 17+) — انیمیشن چندمرحله‌ای مبتنی بر enum. KeyframeAnimator (iOS 17+) — انیمیشن فریم به فریم با keyframeها. انیمیشن‌های SwiftUI از طریق Core Animation روی GPU اجرا می‌شوند. IT Sectr برای انیمیشن‌های طبیعی .spring() و برای اثرات فیزیکی .interpolatingSpring را توصیه می‌کند.

جریان داده (Bindings، @Published، ObservableObject)

ObservableObject — پروتکل برای اشیاء با ویژگی‌های @Published. SwiftUI در ناشر objectWillChange مشترک می‌شود. @Published — تغییرات ویژگی را منتشر می‌کند. @StateObject — ObservableObject ایجاد می‌کند، چرخه حیات را مدیریت می‌کند. @ObservedObject — خارجی را مشاهده می‌کند. Combine — چارچوب برنامه‌نویسی واکنشی. @EnvironmentObject — تزریق وابستگی از طریق محیط. .environmentObject() تنظیم می‌کند، @EnvironmentObject می‌خواند. MVVM — معماری استاندارد: View (SwiftUI) — ViewModel (ObservableObject) — Model. IT Sectr برای ViewModelهای اصلی MVVM + @StateObject را توصیه می‌کند.

swift
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 برای همه عناصر تعاملی برچسب‌های دسترس‌پذیری را توصیه می‌کند.

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

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) را توصیه می‌کند.

swift
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 در SwiftUI چیست؟

View Protocol پروتکل پایه است. نیاز به var body: some View دارد. body توضیحات UI است که روی GPU رندر می‌شود.

@ViewBuilder چیست و چرا به آن نیاز است؟

@ViewBuilder یک Result Builder برای چندین View است. امکان if/else، switch، ForEach در کانتینرها را فراهم می‌کند.

تفاوت بین @StateObject و @ObservedObject چیست؟

@StateObject یک شیء ایجاد می‌کند. @ObservedObject یک شیء موجود را مشاهده می‌کند. @StateObject برای اولین ایجاد در سلسله‌مراتب.

NavigationStack در iOS 16+ چیست؟

NavigationStack — ناوبری مبتنی بر داده. مسیر-محور، deep linking. جایگزین NavigationView.

@FocusState در SwiftUI چگونه کار می‌کند؟

@FocusState — مدیریت فوکوس ورودی. تغییردهنده .focused(). پشتیبانی از enum برای چندین فیلد.

خلاصه

  • View Protocol — var body: some View. اساس SwiftUI. هر View یک struct است.
  • @ViewBuilder — نحو اعلامی برای چندین View. if/else، ForEach درون body.
  • NavigationStack (iOS 16+) — ناوبری مدرن. data-driven، مسیر-محور.
  • @StateObject — مالکیت مدل. @ObservedObject — مشاهده. @EnvironmentObject — تزریق وابستگی.
  • @FocusState — مدیریت فوکوس. مفید برای فرم‌ها و فیلدهای ورودی چندگانه.
  • .task{} — عملیات ناهمگام با لغو خودکار. .onAppear{} — همگام.
  • PreviewProvider و Canvas — پیش‌نمایش در Xcode. @ScaledMetric — اندازه‌های تطبیقی.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه