Mobil Geliştirmede SwiftUI: Nedir, Temel Kavramlar ve Nasıl Çalışır

Yazar: IT Sectr Yayınlanma: 2026-07-02 Okuma süresi: 10 dk
SwiftUI, Apple'ın tüm platformlarda arayüz oluşturmak için bildirimsel framework'üdür. Apple SwiftUI Docs (2025)'a göre, App Store'daki yeni uygulamaların %70'inde SwiftUI kullanılmaktadır. SwiftUI'nin temel kavramlarını anlamak — View Protocol, @ViewBuilder, NavigationStack — modern iOS geliştirmenin temelidir.

Önemli Noktalar

  • View Protocol — var body: some View. Her View, View protokolüne uyan bir yapıdır. body, UI tanımıdır.
  • @ViewBuilder — Kapsayıcılarda birden çok View için Result Builder. body içinde if/else, switch, ForEach.
  • NavigationStack (iOS 16+) — veri odaklı navigasyon. yol tabanlı, derin bağlantı. NavigationView'ın yerini alır.
  • @StateObject — nesne sahipliği. @ObservedObject — gözlem. @EnvironmentObject — ortam.
  • @FocusState — odak yönetimi. .task{}, .onAppear{} — yaşam döngüsü. PreviewProvider — önizleme.

Temeller (View Protocol, body, some View, @ViewBuilder)

View Protocol, SwiftUI'nin merkezi protokolüdür. Tek bir özellik gerektirir: var body: some View. body, UI tanımını döndüren hesaplanmış bir özelliktir. SwiftUI, her durum değişikliğinde body'yi çağırır ve sonucu GPU'da işler.

@ViewBuilder

@ViewBuilder, View'ler için bir Result Builder'dır. Bir closure içinde return ve TupleView olmadan birden çok View yazmaya olanak tanır. if/else, switch, ForEach'i destekler. Tüm kapsayıcılar (VStack, HStack, ZStack, Group) @ViewBuilder kullanır. Alternatif olarak, düzen olmadan gruplama için Group { … } kullanılabilir. some View bir Opaque Type'dır. Derleyici somut View türünü (Text, Button, VStack vb.) bilir, ancak dışarıdan some View olarak döndürür. Bu, imzayı değiştirmeden body türünü değiştirmeye olanak tanır. ViewModifier — View değiştiricisi: .font(), .padding(), .background(). ViewModifier protokolü ve .modifier() ile özel değiştirici.

swift
// @ViewBuilder ve NavigationStack ile View Örneği
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 ile DetailView
struct DetailView: View {
    let item: String
    @StateObject private var viewModel = DetailViewModel()

    var body: some View {
        Text(item)
            .task {
                await viewModel.loadDetails(for: item)
            }
    }
}

Değiştiriciler ve Kapsayıcılar (ViewModifier, NavigationStack, List, Form)

NavigationStack (iOS 16+) — veri odaklı navigasyon. Bir yol (karma değerler dizisi) alır ve navigationDestination aracılığıyla hedefi gösterir. Hedef görünümlerle NavigationLink'in yerini alır. NavigationLink — yığında gezinmek için düğme. List — bölümler, kaydırmalar, silme ve sürükle-bırak ile dikey liste. Form — ayarlar için özelleştirilmiş List: bölümler, seçiciler, anahtarlar, metin alanları. Section — başlık ve alt bilgi ile List/Form'da gruplama. ViewModifier — stilleri yeniden kullanmak için özel değiştiriciler. .modifier(CustomModifier()) — uygulama.

List ve Form Detaylı

List, SwiftUI'de UITableView'in eşdeğeridir. .onDelete, .onMove, .refreshable'ı destekler. SwipeActions — .swipeActions { Button("Sil", role: .destructive) { } }. Form — ayarlar için optimize edilmiştir: DatePicker, Toggle, Stepper, Picker. Başlık/alt bilgi ile Section — gruplama için. OutlineGroup — hiyerarşik listeler (bölümlerle UITableView eşdeğeri). DisclosureGroup — içerikle katlanabilir bölüm. IT Sectr, veriler için List ve ayarlar için Form önerir.

PreviewProvider — Xcode Canvas'da önizlemeler için protokol. Canvas — etkileşimli SwiftUI önizlemesi (@main ve Swift 5.9+ gerektirir). @ScaledMetric — Dynamic Type ile ölçeklenen uyarlanabilir boyut.

Durum Yönetimi (@StateObject, @ObservedObject, @EnvironmentObject, @FocusState)

Property Wrappers, SwiftUI'de durum yönetiminin temelidir. @State — yerel durum (değer türü). @Binding — üst duruma bağlantı. @StateObject — ObservableObject oluşturur. SwiftUI nesnenin yaşam döngüsünü yönetir. @ObservedObject — harici ObservableObject'i gözlemler. @EnvironmentObject — ortamdan nesne (.environmentObject() ile bağımlılık enjeksiyonu). @Environment — sistem değerleri (.colorScheme, .locale). @AppStorage — UserDefaults. @FetchRequest — Core Data sorgusu. @FocusState — giriş odağı.

Sarmalayıcı Amaç Sahiplik
@StateYerel durum (değer türü)View sahiptir
@BindingÜst duruma bağlantıÜst sahiptir
@StateObjectObservableObject oluştururView sahiptir
@ObservedObjectHarici nesneyi gözlemlerHarici sahip
@EnvironmentObjectOrtamdan nesneAta sahiptir
@EnvironmentSistem değeriSistem
@AppStorageUserDefaultsUserDefaults
@FocusStateGiriş odağıView sahiptir

@StateObject vs @ObservedObject: @StateObject bir nesne oluşturur, @ObservedObject onu gözlemler. Hiyerarşide ilk model oluşturma için @StateObject, alt görünümlere iletmek için @ObservedObject kullanın. @FocusState — odak yönetimi: .focused($field, equals: .email). Birden çok alan için enum desteği.

Ortam Değerleri ve DI

@Environment — sistem değerleri: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext. Özel Ortam Değerleri — EnvironmentKey aracılığıyla özel değer. Bağımlılık enjeksiyonu için kullanılır: açık parametreler olmadan hizmetleri iletme. .environment() değiştiricisi — hiyerarşide bir değer ayarlar. @EnvironmentObject — .environmentObject()'ten ObservableObject. Referans türü iletmesiyle @Environment'den ayrılır. IT Sectr, sistem değerleri için @Environment ve hizmetler için @EnvironmentObject önerir.

Yaşam Döngüsü (.task, .onAppear, .onDisappear)

.task{} — görünüm göründüğünde eşzamansız işlem. Kaybolduğunda otomatik iptal. async/await için .onAppear'ın yerini alır. .onAppear{} — göründüğünde eşzamanlı işlem. .onDisappear{} — kaybolduğunda işlem. .onChange(of:) — değer değişikliklerine tepki. .onReceive(Publisher) — Combine yayıncısına tepki. SwiftUI'de View yaşam döngüsü: init → onAppear → body (işleme) → onDisappear. Durum değişikliğinde: body → diff → yeniden işleme. IT Sectr, eşzamansız yükleme için .task ve analitik için .onAppear önerir.

SwiftUI'de Animasyon

.animation() — animasyon değiştiricisi. .transition() — görünme/kaybolma animasyonu. withAnimation — açık durum değişikliği animasyonu. matchedGeometryEffect — farklı görünümler arasında animasyon (hero animasyonu). PhaseAnimator (iOS 17+) — enum tabanlı çok aşamalı animasyon. KeyframeAnimator (iOS 17+) — anahtar karelerle kare kare animasyon. SwiftUI animasyonları Core Animation aracılığıyla GPU'da çalışır. IT Sectr, doğal animasyonlar için .spring() ve fizik efektleri için .interpolatingSpring önerir.

Veri Akışı (Bindings, @Published, ObservableObject)

ObservableObject — @Published özelliklerine sahip nesneler için protokol. SwiftUI, objectWillChange yayıncısına abone olur. @Published — özellik değişikliklerini yayınlar. @StateObject — ObservableObject oluşturur, yaşam döngüsünü yönetir. @ObservedObject — harici gözlemler. Combine — reaktif programlama için framework. @EnvironmentObject — ortam aracılığıyla DI. .environmentObject() ayarlar, @EnvironmentObject okur. MVVM — standart mimari: View (SwiftUI) — ViewModel (ObservableObject) — Model. IT Sectr, ana ViewModel'ler için MVVM + @StateObject önerir.

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("Hata: \(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() }
        }
    }
}

Erişilebilirlik ve Yerelleştirme

Erişilebilirlik SwiftUI'de: .accessibilityLabel(), .accessibilityHint(), .accessibilityValue(), .accessibilityAddTraits(). VoiceOver erişilebilirlik etiketlerini okur. Dynamic Type — @ScaledMetric, @DynamicProperty. Yerelleştirme: String(localized:) (SwiftUI + String Catalog). LocalizedStringKey — otomatik çeviri. Çoğul kuralları — String Catalog aracılığıyla (one, few, many, other). Sağdan sola (Arapça, İbranice) — otomatik desteklenir. .environment(.layoutDirection, .rightToLeft). IT Sectr, tüm etkileşimli öğeler için erişilebilirlik etiketleri önerir.

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 Desteği
struct ScalableText: View {
    @ScaledMetric private var fontSize: CGFloat = 17

    var body: some View {
        Text("Hello, World!")
            .font(.system(size: fontSize))
    }
}

Grafikler ve Görselleştirme (Swift Charts)

Swift Charts (iOS 16+) — grafik oluşturmak için framework. Chart { } — temel kapsayıcı. BarMark, LineMark, PointMark, AreaMark, RuleMark — işaretler. Veriler için ForEach. ChartAxis — eksen özelleştirme. .chartXAxis, .chartYAxis. ChartLegend — gösterge. Interpolasyon — catmullRom, linear, step. Animasyon — Chart için .animation(). IT Sectr, yerleşik grafikler için Swift Charts ve karmaşık grafikler için Charts (DGCharts) önerir.

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) — Apple'ın bağımlılık yöneticisi. Xcode'a entegredir. Destekler: ikili paketler, kaynaklar, testler, swift-6 sıkı eşzamanlılık. semver etiketiyle GitHub üzerinden paket yayınlama. SPM, CocoaPods ve Carthage'ın yerini alan Swift bağımlılıkları için fiili standarttır. IT Sectr, tüm yeni projeler için SPM önerir.

Swift Concurrency (async/await, TaskGroup, AsyncSequence) — async/await, Swift 5.5+'da yerleşiktir. Task — eşzamansızlık birimi. TaskGroup — paralel görevler. AsyncSequence — eşzamansız dizi (AsyncStream, AsyncAlgorithms). Task Local Values — Task için bağlamsal veri. Swift Concurrency, eşzamansız işlemler için Combine'ın yerini tamamen alır.

Sıkça Sorulan Sorular

SwiftUI'de View Protocol nedir?

View Protocol temel protokoldür. var body: some View gerektirir. body, GPU'da işlenen UI tanımıdır.

@ViewBuilder nedir ve neden gereklidir?

@ViewBuilder, birden çok View için Result Builder'dır. Kapsayıcılarda if/else, switch, ForEach'e izin verir.

@StateObject ve @ObservedObject arasındaki fark nedir?

@StateObject bir nesne oluşturur. @ObservedObject var olanı gözlemler. Hiyerarşide ilk oluşturma için @StateObject.

iOS 16+'da NavigationStack nedir?

NavigationStack — veri odaklı navigasyon. yol tabanlı, derin bağlantı. NavigationView'ın yerini alır.

SwiftUI'de @FocusState nasıl çalışır?

@FocusState — giriş odağı yönetimi. .focused() değiştiricisi. Birden çok alan için enum desteği.

Özet

  • View Protocol — var body: some View. SwiftUI'nin temeli. Her View bir struct'tır.
  • @ViewBuilder — birden çok View için bildirimsel sözdizimi. body'de if/else, ForEach.
  • NavigationStack (iOS 16+) — modern navigasyon. veri odaklı, yol tabanlı.
  • @StateObject — model sahipliği. @ObservedObject — gözlem. @EnvironmentObject — DI.
  • @FocusState — odak yönetimi. Formlar ve birden çok giriş alanı için kullanışlıdır.
  • .task{} — otomatik iptal ile eşzamansız işlem. .onAppear{} — eşzamanlı.
  • PreviewProvider ve Canvas — Xcode'da önizlemeler. @ScaledMetric — uyarlanabilir boyutlar.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış