Önemli Noktalar
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, 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.
// @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)
}
}
}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, 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.
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 |
|---|---|---|
| @State | Yerel durum (değer türü) | View sahiptir |
| @Binding | Üst duruma bağlantı | Üst sahiptir |
| @StateObject | ObservableObject oluşturur | View sahiptir |
| @ObservedObject | Harici nesneyi gözlemler | Harici sahip |
| @EnvironmentObject | Ortamdan nesne | Ata sahiptir |
| @Environment | Sistem değeri | Sistem |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | Giriş 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.
@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.
.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.
.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.
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.
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 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.
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))
}
}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.
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
View Protocol temel protokoldür. var body: some View gerektirir. body, GPU'da işlenen UI tanımıdır.
@ViewBuilder, birden çok View için Result Builder'dır. Kapsayıcılarda if/else, switch, ForEach'e izin verir.
@StateObject bir nesne oluşturur. @ObservedObject var olanı gözlemler. Hiyerarşide ilk oluşturma için @StateObject.
NavigationStack — veri odaklı navigasyon. yol tabanlı, derin bağlantı. NavigationView'ın yerini alır.
@FocusState — giriş odağı yönetimi. .focused() değiştiricisi. Birden çok alan için enum desteği.
Özet
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.