SwiftUI, Apple ekosistemindeki tüm platformlarda kullanıcı arayüzleri oluşturmak için Apple tarafından sunulan bildirimsel bir framework'tür. Adımları zorunlu olarak tanımlamak yerine, geliştirici arayüzün nasıl görünmesi gerektiğini bildirir ve SwiftUI bunun oluşturulmasını ve güncellenmesini yönetir. Apple Developer Documentation (2025)'a göre SwiftUI, iOS 15+, iPadOS 15+, macOS 12+, watchOS 8+ ve tvOS 15+'ı destekler ve tüm arayüz bileşenleri için temel yapı taşı olarak View Protocol'ü kullanır.
Önemli Noktalar
body özelliği ile herhangi bir SwiftUI UI bileşeninin temelidir ve görünüm kompozisyonu aracılığıyla bir ekran tanımı döndürür.SwiftUI, Apple tarafından 2019 yılında yeni projelerde UIKit'in yerini almak üzere tanıtılan bildirimsel bir framework'tür. UIView örneklerini manuel olarak oluşturup hiyerarşiye eklemek yerine, geliştirici View protokolüne uyan yapılar aracılığıyla arayüzü tanımlar. SwiftUI, mevcut durum ile yeni durum arasındaki farkı otomatik olarak hesaplar ve kendi işleme motorunu kullanarak yalnızca değişen kısımları yeniden çizer.
Framework, değer semantiği (sınıflar değil yapılar) kullanılarak Swift ile yazılmıştır ve UI bileşenlerini hafif ve iş parçacığı güvenli hale getirir. Objective-C çalışma zamanı nedeniyle UIViewController'ın 200+ bayt olabileceği UIKit'in aksine, bir SwiftUI View yalnızca birkaç bayt boyutunda basit bir yapıdır. Bu, sınırlı belleğe sahip watchOS için özellikle önemlidir.
Aynı View tanımı iPhone, iPad, Mac, Apple Watch, Apple TV ve Apple Vision Pro'da çalışır. SwiftUI arayüzü platforma göre uyarlar: iOS'ta dokunma hareketleri, macOS'ta klavye kombinasyonları, watchOS'ta Digital Crown kaydırma. Bu, birden çok Apple platformunda uygulama yayınlayan şirketler için geliştirme süresini azaltır, ancak her platforma özgü öğeler için ek yapılandırma gerektirir.
SwiftUI'de her ekran, View protokolünü tek bir gereksinimle uygulayan bir yapıdır: some View türünde hesaplanmış bir body özelliği. some anahtar kelimesi (opak tür), somut görünüm türünü gizleyerek SwiftUI'in işlemeyi optimize etmesine olanak tanır. body içinde geliştirici, birden çok görünümü bir araya getiren ViewBuilder'ı kullanarak hazır bileşenleri — Text, Image, Button, List — birleştirir.
struct GreetingView: View {
let name: String
var var body: some View {
VStack {
Text("Merhaba, \(name)!")
.font(.title)
.foregroundColor(.blue)
Image(systemName: "hand.wave")
.imageScale(.large)
}
.padding()
}
}
Örnekte VStack (dikey yığın) Text ve Image içerir. name değeri yapı başlatıcı aracılığıyla iletilir — SwiftUI'de harici DI kapsayıcıları olmadan DI (Bağımlılık Enjeksiyonu) böyle çalışır. Her değiştirici, orijinali değiştirmeden uygulanan değişiklikle birlikte yeni bir görünüm döndürür. Bu, değer türlerinin değişmezliği sayesinde mümkündür.
ViewBuilder, @resultBuilder ile açıklanmış bir sonuç oluşturucudur ve 10'a kadar görünümü bir araya getirir. body içinde ek sarmalayıcılar olmadan if/else, switch ve ForEach kullanılabilir. ForEach, Identifiable öğelerle çalışır — ekleme/silme sırasında doğru animasyon için her görünüme benzersiz bir kimlik atanır.
SwiftUI'de durum, ekranda hangi içeriğin görüntüleneceğini belirler. Durum değiştiğinde, SwiftUI bağımlı görünümün body'sini yeniden oluşturur ve bir diff algoritması kullanarak sonucu öncekiyle karşılaştırır. Durumu depolamak için özellik sarmalayıcıları kullanılır — her biri belirli görevini çözer: yerel durum, alt görünümle bağlantı veya harici veri modeli.
struct CounterView: View {
@State private var count = 0
var var body: some View {
VStack {
Text("Sayaç: \(count)")
Button("Artır") {
count += 1
}
}
}
}
class UserViewModel: ObservableObject {
@Published var name = ""
@Published var age = 0
}
@State, View yapısı içinde yerel basit bir değer (Int, String, Bool) depolar. SwiftUI, belleği yapıdan ayrı bir depolama alanına taşır — bu nedenle @State ile bir özellik, View bir değer türü olsa bile değiştirilebilir. @ObservableObject, @Published özelliklerine sahip sınıflar içindir ve bunların değişiklikleri, SwiftUI'ye yeniden çizim gerekliliği konusunda otomatik olarak bildirimde bulunur.
@Binding, ebeveyn görünümünde bulunan bir veri kaynağıyla iki yönlü bir bağlantı oluşturur. Ebeveyn $variable (yansıtılan değer) iletir ve çocuk bağlama aracılığıyla değeri okur ve yazar. Bu, durumu ebeveynde tutarken metin girişi veya anahtarı ayrı bir bileşene taşımaya olanak tanır. @Binding olmadan, her değişiklik yeni değeri yukarı iletmek için bir geri çağırma closure'ı gerektirirdi.
iOS 16'dan önce, SwiftUI'de navigasyon NavigationView üzerine inşa edilmişti — iPad'de karmaşık davranışa (bölünmüş görünüm, çift sütun) sahip eski bir API. iOS 16'dan itibaren Apple, NavigationStack'i önermektedir — tür güvenli rotalara sahip basitleştirilmiş bir alternatif. Geliştirici olası rotaların bir enum'unu tanımlar ve NavigationStack, derin bağlantılar ve köke dönüş desteğiyle ekran yığınını otomatik olarak yönetir.
enum Route: Hashable {
case detail(id: Int)
case settings
}
struct ContentView: View {
var var body: some View {
NavigationStack {
List {
NavigationLink("Detay ekranı",
value: Route.detail(id: 42))
NavigationLink("Ayarlar",
value: Route.settings)
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
case .settings: SettingsView()
}
}
}
}
}
Hashable'a uygun rotalar, parametre iletmek için herhangi bir veri türünün kullanılmasına izin verir. navigationDestination(for:destination:), rota türünü hedef görünümle ilişkilendirir. UIKit navigasyonuna göre avantajı, yeni bir rota eklerken yeniden çizim gerekmemesidir: enum'a bir case ve switch'e bir işleyici eklemek yeterlidir. Derin bağlantılar NavigationStack'te processDeepLink aracılığıyla işlenir.
Programatik navigasyon (giriş, zamanlayıcı veya sunucu yanıtından sonra) için NavigationLink başlatıcısıyla @State kullanılır: NavigationLink(isActive: $isActive). isActive = true olduğunda, geçiş kullanıcı dokunuşu olmadan gerçekleşir. Bir alternatif, NavigationStack'te $path dizisini bağlamaktır: $path.append(Route.detail(id: 1)).
Modifier, görünümün değiştirilmiş bir kopyasını döndüren bir yöntemdir. Özellik yapılandırmasının mevcut bir görünümü değiştirerek yapıldığı UIKit'in aksine, SwiftUI uygulanan değişiklikle yeni bir değer oluşturur. Değiştirici zincirleme, sıralı dönüşümlerden nihai arayüzü oluşturur: yazı tipi → dolgu → renk → gölge → jest.
Apple, 200'den fazla yerleşik değiştirici sağlar. En yaygın olanlar: .font(), .foregroundColor(), .padding(), .background(), .cornerRadius(), .shadow(), .opacity(), .offset(). Değiştiricilerin sırası önemlidir: .padding()'den önce .background() dolgulu alanı doldurur, sonra — yalnızca iç alanı. Özel değiştiriciler ViewModifier protokolü aracılığıyla oluşturulur.
Değiştiriciler, üçlü operatör aracılığıyla koşullu olarak uygulanabilir: .foregroundColor(isError ? .red : .primary). Animasyon için .animation(.easeInOut, value: state) kullanılır — animasyon değiştiricisi belirli bir durum özelliğine bağlanır. Bu özellik değiştiğinde, SwiftUI eski ve yeni değer arasındaki geçişi canlandırır. Animasyon, opacity, offset, scale, rotation, boyut ve renk ile çalışır — her özelliğin karşılık gelen bir AnimatableParameter'ı vardır.
Özel animasyonlar için .transition (görünme/kaybolma) ve .matchedGeometryEffect (bir öğenin iki kapsayıcı arasında yumuşak geçişi) mevcuttur. İkincisi, listelerde kahraman animasyonu için kullanılır: bir liste hücresindeki simge, ayrıntı ekranında büyük bir görüntüye yumuşak bir şekilde dönüşür.
SwiftUI ve UIKit arasındaki seçim, iOS geliştiricisinin ilk ikilemlerinden biridir. Her iki framework de Apple tarafından desteklenir ancak arayüz oluşturma sorununu temelde farklı şekillerde çözer: SwiftUI bildirimsel olarak, UIKit zorunlu olarak. Fark, durum yönetimi, navigasyon, performans ve uyumlulukta kendini gösterir.
| Yön | SwiftUI | UIKit |
|---|---|---|
| Yaklaşım | Bildirimsel: ne gösterileceği | Zorunlu: nasıl oluşturulacağı |
| Durum | Property Wrappers, otomatik yeniden çizim | Manuel: reloadData, setNeedsLayout |
| UI Kodu | Kompakt, değiştirici zincirleri | Ayrıntılı, NSCoder/Storyboard/kısıtlamalar |
| Performans | iOS 17+'da yüksek, diff algoritması | iOS 12–16'da zirve, doğrudan kontrol |
| Minimum Sürüm | iOS 15+ (tam destek) | iOS 2+ (tüm sürümler) |
Minimum iOS 17 sürümüne sahip yeni projeler için Apple, SwiftUI'yi birincil framework olarak önerir. UIKit, işleme üzerinde ince ayar kontrolü (özel UICollectionViewLayout, karmaşık CAAnimation sahneleri) veya iOS 12–14 desteği gerektiren arayüzler için gerekli olmaya devam eder. Birçok proje hibrit bir yaklaşım kullanır: UIHostingController aracılığıyla SwiftUI bir UIKit uygulamasına gömülür ve UIViewRepresentable, SwiftUI hiyerarşisi içinde UIKit bileşenlerinin kullanılmasına izin verir.
Sıkça Sorulan Sorular
Evet, UIHostingController (SwiftUI in UIKit) ve UIViewRepresentable (UIKit in SwiftUI) aracılığıyla. Bu, geçiş sırasında popüler olan hibrit bir yaklaşımdır.
iOS 17 tam işlevsellik sağlar: NavigationStack, Observation framework, Swift Charts. iOS 15, üretim için minimum eşiktir.
En yaygın neden, bir arka plan iş parçacığında @Published özelliğini değiştirmektir. ObservableObject, değişiklikleri main actor üzerinde göndermelidir: @MainActor class ViewModel.
Combine aracılığıyla .debounce kullanın: Button.publisher(for: .tap) .debounce(for: .seconds(0.3), scheduler: RunLoop.main).
Evet, Gesture değiştiricileri aracılığıyla: DragGesture, LongPressGesture, MagnificationGesture, RotationGesture. .simultaneousGesture() ve .sequenced() kullanarak birleştirin.
Ö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.
Ayrıca okuyun