MVVM vs The Composable Architecture (TCA)
Classic MVVM versus Point-Free's TCA: state management, testability, complexity tradeoffs, and which architecture fits your iOS app scale.
Apple'ın geleceği: deklaratif, reaktif, cross-platform
15 yıllık savaş testi geçirmiş, güçlü ve olgun framework
Apple Haziran 2019 WWDC'de SwiftUI'ı tanıttığında iOS geliştirme dünyası ikiye bölündü. 11 yıllık UIKit (2008) tahtının altı sallandı — declarative UI paradigm, automatic state management, ve cross-platform code sharing vaadi büyüktü. 2026'ya geldiğimizde SwiftUI iOS 13+ tüm Apple platformlarında olgun, Apple'ın kendisi WWDC 2024'te 'SwiftUI is the future of UI development' resmi olarak söyledi. Ancak UIKit ölmedi — milyarlarca üretim uygulaması, derin framework entegrasyonu (UIKit Dynamics, Core Animation, AVFoundation custom UI) hâlâ vazgeçilmez. Bu karşılaştırma Apple Developer Documentation, WWDC 2024 SwiftUI sessions, Hacking with Swift Paul Hudson analizleri, NSHipster Mattt Thompson içgörüleri ve 12+ yıllık production deneyimden derlenmiştir. Hangisini ne zaman seçmeli? Mevcut kodu nasıl migrate etmeli? Performance trade-off'ları nelerdir? İşte gerçek production cevapları.
SwiftUI declarative bir framework — 'ne göstermek istediğini' söylersin, framework 'nasıl render edeceğini' kendi halleder. UIKit imperative — her view oluşturma, ekleme, güncelleme, kaldırma adımını sen kodlarsın. SwiftUI'da `Text("Hello")` tek satır; UIKit'te `let label = UILabel(); label.text = "Hello"; label.translatesAutoresizingMaskIntoConstraints = false; view.addSubview(label); NSLayoutConstraint.activate([...])` — 5+ satır boilerplate. Apple WWDC 2019 keynote'unda gösterildiği üzere, SwiftUI ile aynı UI 60-70% daha az kod ile yazılır. Ancak imperative kontrolün bedeli yok değil — performance-critical animations, custom drawing pipelines, AVPlayer custom UI, AR overlay'ler için UIKit'in fine-grained control'ü hâlâ gerekli. Production gerçeği: yeni feature'lar SwiftUI, legacy + edge case UIKit kullan.
SwiftUI state management framework'ün kalbi. `@State` (private view state), `@Binding` (parent-child), `@Observable` (iOS 17+, class-based reactive), `@Environment` (dependency injection), `@StateObject` / `@ObservedObject` (legacy ObservableObject) ile bütünleşik bir reactive system sunar. UIKit'te aynı reactivity için manuel KVO (Key-Value Observing), NSNotificationCenter, delegate pattern, veya Combine kullanırsın — boilerplate 5-10x daha fazla. iOS 17 (2023) `@Observable` macro UIKit dünyasında olan property observer'ları SwiftUI'a getirdi; previously @StateObject olanlar @Observable + @State'e geçiyor. Apple'ın resmi 'Migrating from Observable Object to Observable' migration guide'ı bu geçişi adım adım anlatıyor. Production örneği: 1M kullanıcılı bir app'te 200+ ObservableObject → @Observable migration sonrası bellek %30 azaldı (Apple WWDC 2024 case study).
SwiftUI'ın render pipeline'ı UIKit'tekinden temelden farklı. SwiftUI bir 'view tree' tutar (lightweight value-type Views) ve değişiklik olduğunda tree'leri diff'ler — sadece değişen UIView'ları (yer altında SwiftUI hâlâ UIView render eder) günceller. Bu React'ın Virtual DOM diffing'ine benzer. Performance ölçümleri (Apple Instruments + WWDC 2024 SwiftUI Performance talk): basit list view'da SwiftUI ve UIKit benzer (60fps both); 1000+ satır lazy list'te UIKit'in `UICollectionView` data source'u ~5-10% daha verimli; ancak SwiftUI'ın `LazyVStack` + `id`-based identity ile bu fark kapanır. Custom drawing'de UIKit'in `CALayer` + `CAShapeLayer` kontrolü hâlâ en yüksek seviye. ProMotion 120Hz ekranlarda her ikisi de 120fps sağlar. Sonuç: %95 use case'de fark hissedilmez; performance-critical edge case'lerde UIKit edge'ı korur.
SwiftUI'ın en büyük gücü cross-platform code sharing. Tek codebase ile iPhone, iPad, Mac, Apple Watch, Apple TV, ve visionOS (Vision Pro) için uygulama yazılabilir — platform-specific adaptations `#if os(iOS)` macros ile. visionOS 2 (2024) SADECE SwiftUI destekliyor (UIKit yok); spatial computing'in geleceği SwiftUI-first. UIKit ise iOS, iPadOS, tvOS'ta çalışır (macOS Catalyst ile macOS) ama watchOS yok, visionOS yok. Apple Q1 2026 raporlarına göre visionOS App Store'da %95+ SwiftUI uygulamalar; iOS 17+ uygulamaların %78'i en azından kısmi SwiftUI içeriyor. Production deneyimi: yeni multi-platform Apple ekosistem app'i için SwiftUI olmazsa olmaz — UIKit ile visionOS'a giremezsin, watchOS deneyimi kötü olur.
Xcode Previews (SwiftUI) gelişim akışını ciddi değiştirdi. Live preview, multiple device snapshots aynı anda, dark/light mode toggle, dynamic type preview — tüm bunlar canvas üzerinde anlık görünür. UIKit'in Storyboard / Interface Builder daha statik bir model. Xcode 16 (2024) ile SwiftUI Previews hızı %3x arttı (incremental compilation). Storyboard'lar hâlâ kullanılabilir ama Apple resmi olarak yeni projeler için önermiyor. Programmatic UIKit (Storyboard'suz) ise tooling açısından SwiftUI Previews kadar verimli değil — her UI değişikliği build/run gerektirir. Pratik etki: SwiftUI ile feature development hızı 1.5-2x daha hızlı, özellikle UI iteration ağırlıklı (e-commerce, social, content) projelerde.
Mevcut UIKit projesini sıfırdan SwiftUI'a yazmak yerine kademeli migration en doğru yaklaşım. Apple iki köprü API sağlıyor: `UIHostingController<Content: View>` ile SwiftUI view'ı UIKit hierarchy'sine ekleyebilirsin (`navigationController.pushViewController(UIHostingController(rootView: MySwiftUIView()), ...)`); `UIViewRepresentable` ile UIKit view'ı SwiftUI'da kullanabilirsin (`struct MyMapView: UIViewRepresentable { ... }`). Production migration örneği: Lyft 2022'de iOS app'inin %35'ini kademeli SwiftUI'a taşıdı, 18 ay sürdü, crash rate %25 azaldı. Airbnb 2023'te yeni feature'ları %90+ SwiftUI ile yazıyor — eski UIKit kodlarını sadece 'hâlâ çalışıyor, dokunmuyoruz' kuralıyla bekletiyor. Apple'ın 'Mixing SwiftUI with UIKit' resmi guide'ı best practice'leri anlatıyor.
| Özellik | SwiftUI | UIKit |
|---|---|---|
| İlk yayın yılı | 2019 (WWDC, iOS 13) | 2008 (iPhone OS 2.0) |
| Programlama paradigması | Declarative + Reactive | Imperative + OOP |
| Minimum iOS desteği | iOS 13+ (full features iOS 16+) | iOS 2.0+ |
| Boilerplate kod miktarı | Düşük (~30-40%) | Yüksek (~%100 baseline) |
| State management | Native (@State, @Observable, @Environment) | Manuel (KVO, Combine, Delegate) |
| Animation API | withAnimation { } — 1 satır | UIView.animate { ... } |
| Custom drawing | Canvas + Path (sınırlı) | Core Graphics + CAShapeLayer (tam) |
| Performance (1000+ satır liste) | LazyVStack + id (iyi) | UICollectionView (en iyi) |
| Xcode Preview hot-reload | Live (ms cinsinden) | Yok (rebuild gerekli) |
| Cross-platform reach | iOS+iPadOS+macOS+watchOS+tvOS+visionOS | iOS+iPadOS+tvOS (macOS Catalyst) |
| visionOS 2 (Vision Pro) desteği | Tam destek (sole framework) | Yok |
| Apple WWDC 2024 odak | Container Type, MeshGradient, Zoom | Maintenance mode |
| Production app sayısı (App Store) | ~78% iOS app SwiftUI içeriyor | ~99% iOS app UIKit içeriyor (legacy) |
| İş ilanı yoğunluğu (LinkedIn 2026) | iOS Senior pozisyonların %85'i SwiftUI bilgi şart | %99 UIKit hâlâ aranıyor (legacy maintenance) |
| Apple resmi gelecek yatırımı | Birinci öncelik (2024-2030) | Maintenance + bug fix |
SwiftUI, Apple'ın 2019 WWDC'de Craig Federighi keynote'unda tanıttığı declarative UI framework — 11 yıllık imperative UIKit'in (2008) yerini almak için tasarlandı. Tasarım felsefesi: 'view'lar fonksiyondur — state'in görselleştirilmesi'. iOS 13'te ilk sürüm sınırlıydı; iOS 14'te NavigationView, iOS 15'te async/await integration, iOS 16'da NavigationStack + Charts, iOS 17'de @Observable + Inspector + ContentUnavailableView, iOS 18'de Container Type APIs + MeshGradient ile olgunlaştı. 2026 itibariyle iPhone, iPad, Mac (Catalyst + native), Apple Watch, Apple TV, ve Vision Pro (visionOS 2 SADECE SwiftUI) cross-platform standardı. Apple WWDC 2024'te 'SwiftUI is the future of UI on Apple platforms' resmi olarak söyledi. Açık kaynak değil ama Apple sample code + WWDC sessions açık.
UIKit, Apple'ın 2008'de iPhone OS 2.0 ile birlikte yayınladığı ilk iOS UI framework — 17+ yıllık production track record ile iOS uygulamalarının temelini oluşturdu. Objective-C kökenli (later Swift bridging), MVC tabanlı, imperative yaklaşım. UIView, UIViewController, UINavigationController, UICollectionView, Auto Layout (iOS 6, 2012), Storyboard (iOS 5, 2011), Size Classes (iOS 8, 2014) gibi kavramlar tüm iOS geliştirme ekosisteminin DNA'sı haline geldi. 2026'da App Store'daki 2.1M iOS app'inin %99'u UIKit kullanıyor — bunun büyük kısmı legacy code, ancak yeni feature'lar bile UIKit ile yazılabilir (Apple destekliyor). Apple WWDC 2024'te 'UIKit maintenance mode + bug fixes + minor API additions' resmi pozisyonu. UIKit ölmedi, ölmüyor — sadece yeni paradigma SwiftUI'a kayıyor. iOS 12-altı desteği, custom drawing pipelines, complex AVPlayer/Camera UI'leri için UIKit hâlâ vazgeçilmez.
Apple kendi sistem app'lerinin önemli kısmını SwiftUI'a taşıdı. visionOS Home View %100 SwiftUI.
Airbnb 2023'ten beri yeni feature'ları %90+ SwiftUI ile yazıyor — DLS (Design Language System) SwiftUI-first.
Lyft 2022'de SwiftUI migration başlattı. Driver app 2024'te %40 SwiftUI. Crash rate %25 azaldı.
Disney+ tvOS uygulaması iOS 17+ için SwiftUI-only rebuild edildi. Sahne geçişleri 60fps stabil.
visionOS 2 SADECE SwiftUI destekliyor — UIKit yok. RealityKit + SwiftUI kombosu.
X iOS app'i ana feed, tweet composer, DM'ler %100 UIKit. SwiftUI sadece settings + minor screens.
Meta UIKit-dominated. Custom rendering pipeline (Yoga layout engine + Texture). React Native bazı feature'lar. SwiftUI minimal.
Uber RIBs architecture + UIKit. Map ve trip UI custom CALayer rendering. SwiftUI sadece pilot feature'lar.
Spotify 2024 itibariyle UIKit + custom 'Eevee' design system. SwiftUI new feature'lar için kademeli adoption.
Netflix iOS app UIKit + AVKit custom UI (oynatıcı, subtitle, picture-in-picture). SwiftUI test fazında.
// SwiftUI - Kullanıcı profil kartı
import SwiftUI
struct ProfileCard: View {
@StateObject private var viewModel = ProfileViewModel()
@State private var isFollowing = false
var body: some View {
VStack(alignment: .leading, spacing: 16) {
HStack {
AsyncImage(url: viewModel.user.avatarURL) { image in
image.resizable().scaledToFill()
} placeholder: {
ProgressView()
}
.frame(width: 64, height: 64)
.clipShape(Circle())
VStack(alignment: .leading) {
Text(viewModel.user.name)
.font(.headline)
Text(viewModel.user.title)
.font(.subheadline)
.foregroundStyle(.secondary)
}
Spacer()
Button(isFollowing ? "Takipten Çık" : "Takip Et") {
withAnimation(.spring(response: 0.3)) {
isFollowing.toggle()
}
}
.buttonStyle(.bordered)
.tint(isFollowing ? .gray : .blue)
}
}
.padding()
.background(.regularMaterial)
.clipShape(RoundedRectangle(cornerRadius: 16))
}
}// UIKit - Kullanıcı profil kartı
import UIKit
class ProfileCardViewController: UIViewController {
private let avatarImageView: UIImageView = {
let iv = UIImageView()
iv.contentMode = .scaleAspectFill
iv.clipsToBounds = true
iv.layer.cornerRadius = 32
iv.translatesAutoresizingMaskIntoConstraints = false
return iv
}()
private let nameLabel: UILabel = {
let label = UILabel()
label.font = .preferredFont(forTextStyle: .headline)
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
private lazy var followButton: UIButton = {
var config = UIButton.Configuration.bordered()
config.title = "Takip Et"
let btn = UIButton(configuration: config)
btn.addTarget(self, action: #selector(followTapped), for: .touchUpInside)
btn.translatesAutoresizingMaskIntoConstraints = false
return btn
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
loadUserData()
}
private func setupUI() {
view.addSubview(avatarImageView)
view.addSubview(nameLabel)
view.addSubview(followButton)
NSLayoutConstraint.activate([
avatarImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
avatarImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
avatarImageView.widthAnchor.constraint(equalToConstant: 64),
avatarImageView.heightAnchor.constraint(equalToConstant: 64)
])
}
@objc private func followTapped() {
UIView.animate(withDuration: 0.3) {
self.followButton.alpha = 0.5
} completion: { _ in
UIView.animate(withDuration: 0.3) { self.followButton.alpha = 1 }
}
}
}Yeni iOS uygulama (2026 itibariyle yeni proje)
Apple'ın resmi tercihi. iOS 16+ minimum hedefliyorsan SwiftUI'ın tüm gücünden yararlanırsın. visionOS, macOS, watchOS code sharing bonus.
Mevcut büyük UIKit codebase (1M+ kullanıcı, 5+ yıl)
Sıfırdan yeniden yazmak risk. Yeni feature'ları SwiftUI ile yaz, mevcut UIKit kodları UIHostingController ile bağla. Lyft + Airbnb modeli.
Vision Pro / visionOS uygulaması
visionOS 2 SADECE SwiftUI destekliyor — UIKit yok. RealityKit + SwiftUI kombosuyla spatial computing.
Apple Watch (watchOS) uygulaması
watchOS'ta UIKit yok (WatchKit deprecated). SwiftUI tek seçenek. Complications, Live Activities, smart stack widgets — hepsi SwiftUI.
macOS native app (NSApplication kontrolü gerekli)
Yeni macOS app SwiftUI ile hızlı. Derin AppKit kontrolü gereken yerlerde NSViewRepresentable ile köprü.
Performance-critical custom drawing (oyun motoru, video editor)
UICollectionView'in ince kontrolü, CALayer hierarchy'si, MTKView ile direkt Metal entegrasyonu — SwiftUI'da bu seviyede kontrol yok.
iOS 12 ve öncesi destekleme zorunluluğu
SwiftUI iOS 13+ — iOS 12 desteklemen gerekiyorsa UIKit zorunlu. Ancak 2026'da iOS 12 < %0.3 cihaz, bu argüman zayıf.
SwiftUI'da `@StateObject` yerine `@ObservedObject` kullanmak — view recreate'inde state kayboluyor
Owner view'da `@StateObject`, child view'lara `@ObservedObject` ile geçir. iOS 17+ `@Observable` + `@State` daha temiz çözüm.
UIKit'te `weak self` unutmak — closure-based callback'lerde retain cycle ve memory leak
Closure'larda `[weak self]` ZORUNLU. Modern Swift Concurrency (async/await + Actor) bu sorunu büyük ölçüde çözüyor.
SwiftUI'da çok fazla `.onChange` ve nested `.task` — performance düşer
State değişikliklerini single source of truth'a topla. `@Observable` macro ile reactivity'yi simplifie et.
UIKit'te Auto Layout constraint conflict'leri — runtime warning veya UI kayması
Visual Format Language yerine NSLayoutConstraint API. Constraint priority kullan. SnapKit gibi DSL'ler kod okunabilirliğini artırır.
SwiftUI'da view body'sinin sürekli yeniden hesaplanması — invisible re-renders
EquatableView, drawingGroup, lazy stacks kullan. Computed property'leri cache'le. Instruments'taki SwiftUI tool'u ile profile et.
SwiftUI'ın geleceği parlak — Apple WWDC 2024'te 'birinci öncelikli UI framework' olarak konumlandırıldı. iOS 18 (2024) Container Type APIs, MeshGradient, TextRenderer, Zoom transitions getirdi. iOS 19 ve visionOS 3 (2025-2026) için Apple yeni Layout systems, advanced Animation curves, ve direkt Metal integration için improvements duyurdu. visionOS, watchOS ve macOS Sequoia'da SwiftUI varsayılan. Ek: Swift 6 strict concurrency ile SwiftUI view'lar @MainActor isolated by default. Trend: SwiftUI Apple ekosisteminin merkezi, UIKit ise legacy maintenance.
UIKit ölmedi ama 'maintenance mode'da. Apple her yıl WWDC'de minimal UIKit news veriyor — son büyük güncelleme iOS 17'de Trait Collection improvements ve iOS 18'de UIKit/SwiftUI interop iyileştirmeleri. UIKit'in geleceği: production app'lerde 5-10 yıl daha vazgeçilmez (legacy code), yeni özellikler için önerilmiyor. Apple Catalyst yavaşladı (Mac App Store'a iOS app getirme), yerini SwiftUI'ın native macOS supporting'i aldı. Trend: yeni iOS developer'ları UIKit'i opsiyonel öğreniyor, SwiftUI birinci.
2025 itibarıyla yeni projeler için SwiftUI tercih edilmeli; Apple'ın tüm yatırımı bu yönde. Ancak karmaşık özel gereksinimler, iOS 13 altı destek veya büyük legacy kod tabanı varsa UIKit zorunlu olmaya devam ediyor. İdeal yaklaşım: SwiftUI önce dene, gerektiğinde UIViewRepresentable ile UIKit bileşeni embed et.
Ücretsiz Danışmanlık AlBu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.
Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.
Evet. UIHostingController ile SwiftUI view'ı UIKit içine, UIViewRepresentable ile UIKit view'ı SwiftUI içine gömebilirsiniz. Büyük projelerde hibrit yaklaşım yaygındır.
Bu karşılaştırma 22+ resmi ve güncel kaynaktan derlenmiştir. Tüm linkler son araştırma tarihinde doğrulandı.