SwiftUI’da Parçalama Stratejisi ve ViewModel Kullanımı
- 160 Views
- Hikmet Tüfekçi
- Temmuz 9, 2025
- Teknoloji Uncategorized Yazılım
SwiftUI ile çalışan herkes bilir; ilk başta her şey kolaydır, hızlıdır. Ama proje büyüdükçe ContentView.swift dosyanız 1000, 2000 hatta 3000 satıra çıkabilir. Kod çalışsa bile artık küçük bir güncelleme bile baş ağrısı yaratır. Ben de tam bu noktada SwiftUI projelerimi modüler hale getirerek nefes aldım. Bu yazıda size kendi deneyimimle birlikte, parçalama stratejisi, ViewModel yapısı ve çoklu sheet yönetimi konularında rehber olabilecek bir yol haritası sunuyorum.
Neler Yaşadım?
Projemde neredeyse tüm özellikleri ContentView.swift dosyasına yazmıştım:
- Liste görünümü
- Fiş kartları
- OCR işlemleri
- PDF işleme
- Bildirimler
- Sayfa geçişleri
Sonuç olarak:
- Kod 2500 satırı geçti.
- Xcode Preview sürekli çöküyordu.
@State
’ler arası bağımlılıklar kontrolden çıktı.- Her yeni özellik “ya bir şeyi bozarsam” korkusuyla yazılıyordu.
Geliştirdiğim Strateji
✨ Prompt Kalıbım:
Ben bu süreci bir yapay zeka (Cursor) yardımıyla yaparken şu prompt kalıbını geliştirdim:
“Parçalama stratejisi uygula. State karmaşasını önle. Çok sheet kullanımını ViewModel üzerinden aktif sayfa tipi ile yönet.”
Bu cümle bana rehber oldu.
Adım Adım Kurtuluş Planı
1. Her View’u Kendi Dosyasına Ayır
Bütün ekranlarımı Views/
klasörü altında ayrı .swift
dosyalarına taşıdım:
- ReceiptCardView.swift
- ReceiptDetailView.swift
- ReceiptEditView.swift
- SplashView.swift
- DashboardView.swift
Bu sayede hangi bileşenin ne yaptığı netleşti.
2. İş Mantığını ViewModel’e Aktar
Görünüme ait olmayan tüm @State
değişkenlerini ve işlevleri ObservableObject
sınıfa taşıdım:
class ReceiptViewModel: ObservableObject {
@Published var receipts: [Receipt] = []
func add(_ receipt: Receipt) { ... }
func delete(_ receipt: Receipt) { ... }
}
Bu sayede kod okunabilirliği ve test edilebilirlik çok arttı.
3. Sheet Kullanımını Enum ile Yönet
Projede birden fazla .sheet
vardı. Hepsini ViewModel’de tek bir enum üzerinden yönettim:
enum ActiveSheet: Identifiable {
case detail(Receipt), edit(Receipt)
var id: String { ... }
}
View’da sadece şunu yazmak yetti:
.sheet(item: $viewModel.activeSheet) { sheet in
switch sheet {
case .detail(let receipt): ReceiptDetailView(receipt: receipt)
case .edit(let receipt): ReceiptEditView(receipt: receipt)
}
}
4. Servisleri Services/
Klasörüne Ayır
OCR işlemleri, PDF verisi oluşturma gibi işlevleri kendi sınıflarına taşıdım:
- PDFService.swift
- TextRecognitionService.swift
Bu sayede kodu daha sonra başka projelere de taşımak kolaylaştı.
5. Dosya Yapısını Standartlaştır
Uygulamanın klasör yapısını şu hale getirdim:
HikmetApp/
├── Views/
├── ViewModels/
├── Models/
├── Services/
├── Utils/
Bu yapı, büyük projelerde yön bulmayı inanılmaz kolaylaştırıyor.
Sonuç: Rahat Kod, Hızlı Geliştirme
Bu değişikliklerden sonra şunlar oldu:
- Artık ContentView.swift sadece 100–150 satır
- Yeni özellikleri daha az korkuyla yazıyorum
- Xcode Preview sorunsuz çalışıyor
- Hataları çok daha kolay yakalıyorum
Merhaba, ben Hikmet Tüfekçi. Bu siteyi açma sebebim de bir yazı alışkanlığı yakalamak ve güncel konular hakkında bilgi vermektir. Benimle iletişime geçmek isterseniz iletişim sayfasından formu doldurabilirsiniz.