List — nedir, SwiftUI'de liste bileşeni

Yazar: IT Sectr Yayınlanma: 2026-06-25 Okuma süresi: 7 dk

List, SwiftUI'de verileri dikey olarak kaydırılabilir bir liste halinde görüntülemek için bir kapsayıcı View'dir, UIKit'teki UITableView'e benzer. Apple Developer Documentation, 2024'e göre, List statik ve dinamik bölümleri, kaydırma eylemlerini, satır yeniden sıralamayı ve çekerek yenilemeyi destekler. UITableView'in aksine, List SwiftUI ve ForEach'e dayalı bildirimsel bir API kullanır, hücre yeniden kullanımını ve çok sayıda satırla performansı otomatik olarak yönetir.

Önemli Noktalar

  • List — SwiftUI'de kaydırılabilir veri listesi için kapsayıcı
  • ForEach — List'te verileri dinamik olarak görüntülemenin ana yolu
  • Bölümler — Satırları başlıklarla gruplamak için Section View
  • Kaydırma eylemleri — iOS 15+ için swipeActions
  • Çekerek yenileme — iOS 15+ için .refreshable

SwiftUI'de List nedir?

List, öğelerin bir dizisini dikey olarak kaydırılabilir bir listede görüntüleyen bir View'dir. iOS 13'te SwiftUI ile birlikte tanıtıldı ve UIKit'teki UITableView'in yerini alan veri listelerini görüntülemenin birincil yoludur. List, hücre yeniden kullanımını, kaydırmayı ve performansı otomatik olarak yönetir.

List, yavaş yüklemeyi kullanır: hücreler kaydırdıkça oluşturulur, hepsi bir kerede değil. Bu, onu ScrollView içindeki VStack ve ForEach'ten ayırır; burada tüm hücreler oluşturma zamanında oluşturulur. List ayrıca kaydırma eylemleri, çekerek yenileme, düzenleme (silme/taşıma) ve satır seçimi için yerleşik destek sağlar.

Apple WWDC 2021 (Session 10072)'ye göre, iOS 15+'daki List, koleksiyon düzeyinde yeni bir farklılaştırma mekanizması sayesinde önemli performans iyileştirmeleri aldı. Bu, özellikle yüzlerce satır içeren listeler için veri güncelleme sırasında List'i daha verimli hale getirdi.

List vs ScrollView + VStack

Geliştiriciler genellikle bir View kümesini görüntülemek için List ile ScrollView + VStack arasında seçim yapar. Temel fark: List, hücre yeniden kullanımını (UITableView gibi) kullanırken, ScrollView + VStack tüm View'ları hemen oluşturur. Sabit boyutlu listeler (20 öğeye kadar) için fark ihmal edilebilir düzeydedir. 50+ satırlı dinamik listeler için performans açısından List tercih edilir.

Statik ve dinamik listeler

Statik liste, doğrudan List gövdesinde belirtilen sabit sayıda satıra sahip bir listedir. Menüler, ayarlar ve bilinen öğe kümelerine sahip formlar için kullanılır. Her satır, döngü veya ForEach olmadan açıkça bildirilir.

swift
// Statik liste (menüler ve ayarlar için)
List {
    Text("Profil")
    Text("Ayarlar")
    Text("Hakkında")
}

// Dinamik liste (veriler için)
struct UserList: View {
    let users: [User]

    var body: some View {
        List(users) { user in
            HStack {
                Text(user.name)
                Text(user.role)
                    .foregroundColor(.secondary)
            }
        }
    }
}

Dinamik liste, List(data:rowContent:) başlatıcısını veya List gövdesi içinde ForEach'i kullanır. İlk yaklaşım, her satırın bir veri öğesine karşılık gelmesi durumunda uygundur. İkincisi, veriler arasında bölümler veya ek öğeler olduğunda kullanışlıdır.

Tanımlama (Identifiable): Dinamik listeler için, veri öğeleri Identifiable protokolüne uymalı veya data:id demetinde benzersiz bir tanımlayıcıya KeyPath belirtmelisiniz. SwiftUI, değişiklikleri (ekleme, silme ve satır taşıma) izlemek için tanımlayıcıları kullanır.

Bölümler ve veri gruplama

Section, List'te satırları bir başlık ve isteğe bağlı footer ile gruplamak için bir View'dir. Section, header ve footer'ı ViewBuilder olarak kabul eder, bölüm başlıkları için yalnızca metin değil aynı zamanda özel View'lar kullanılmasına da olanak tanır.

swift
struct SettingsView: View {
    var body: some View {
        List {
            Section(header: Text("Hesap")) {
                Text("Ad")
                Text("E-posta")
            }
            Section(header: Text("Bildirimler")) {
                Toggle("Push", isOn: $pushEnabled)
                Toggle("Email", isOn: $emailEnabled)
            }
        }
        .listStyle(.insetGrouped)
    }
}

// ForEach ile dinamik bölümler
List {
    ForEach(groupedData.keys.sorted(), id: \.self) { key in
        Section(header: Text(key)) {
            ForEach(groupedData[key]!) { item in
                Text(item.title)
            }
        }
    }
}

List Stilleri: SwiftUI, .listStyle() değiştiricisi aracılığıyla birkaç yerleşik stil sağlar. .insetGrouped — iOS Settings için standart, .plain — minimalist, .inset — girintili, .sidebar — iPad'de Sidebar için.

SwiftUI Cookbook (2024)'e göre, dinamik bölümler ve içinde ForEach bulunan Section, karmaşık yapıya sahip uygulamalarda verileri gruplamak için standart bir desendir. Temel kural: Section'ı Section içine yerleştirmeyin ve Section ile birlikte List(data:) başlatıcısını kullanmayın — List gövdesi içinde ForEach kullanın.

Kaydırma eylemleri ve çekerek yenileme

.swipeActions(edge:allowsFullSwipe:content:) — iOS 15+ için List satırlarına kaydırma eylemleri ekleyen bir değiştirici. Sola (varsayılan) veya sağa kaydırırken farklı renkler ve rollerle (destructive, cancel) düğmelerin görüntülenmesine olanak tanır.

swift
struct TaskList: View {
    @Binding var tasks: [Task]

    var body: some View {
        List {
            ForEach($tasks) { $task in
                Text(task.title)
                    .swipeActions(edge: .trailing) {
                        Button("Sil", role: .destructive) {
                            tasks.removeAll { $0.id == task.id }
                        }
                    }
                    .swipeActions(edge: .leading) {
                        Button(task.isDone ? "Geri al" : "Bitti") {
                            task.isDone.toggle()
                        }
                        .tint(.green)
                    }
            }
        }
        .refreshable {
            // Zamansız veri yükleme
            await loadTasks()
        }
    }
}

.refreshable — iOS 15+ için çekerek yenileme ekleyen bir değiştirici. Kullanıcı listeyi aşağı çektiğinde yürütülen bir async closure kabul eder. SwiftUI otomatik olarak bir yükleme göstergesi görüntüler. İşlem tamamlandıktan sonra gösterge gizlenir.

.onDelete ve .onMove — iOS 13+ için satır silme ve yeniden sıralama desteği ekleyen değiştiriciler. Bunları kullanmak için, verileri Binding ile ForEach içine sarın veya List veya ForEach'te .onDelete(perform:) aracılığıyla closure'ları iletin.

List performansı ve optimizasyon

List performansı satır sayısına, her hücrenin karmaşıklığına ve veri güncelleme sıklığına bağlıdır. SwiftUI, yavaş yükleme ve hücre yeniden kullanımı (UITableView.dequeueReusableCell'e benzer) kullanır, ancak 500+ satırlı listeler için ek optimizasyonlar gerekebilir.

OptimizasyonAçıklamaiOS sürümü
IdentifiableHer öğe için benzersiz kimlikleriOS 13+
EquatableViewVeriler eşit olduğunda yeniden çizmeyi önleriOS 13+
id(_:)Kimlik değiştiğinde View'in yeniden oluşturulmasını zorlariOS 13+
.equatable()Equatable ile katı karşılaştırmaiOS 15+
Diffable dataDeğişikliklerde otomatik farklılaştırmaiOS 15+

Sorun 1: Sık güncellemeler. Listedeki veriler sık sık güncelleniyorsa (örneğin, her saniye), List her durum değişikliğinde görünür hücreleri yeniden çizebilir. Çözüm: veriler için yapılar (değer türleri) kullanın — SwiftUI bunları değere göre karşılaştırır ve yalnızca değişen satırları yeniden çizer.

Sorun 2: Ağır hücreler. Her satır karmaşık bir View hiyerarşisi, resimler ve animasyonlar içeriyorsa, kaydırma yavaşlayabilir. Çözüm: hücreleri ayrı View'lara çıkarın, gereksiz yeniden çizmeleri önlemek için EquatableView kullanın. SwiftUI Lab (2024)'e göre, karmaşık bir satırı alt bileşenlere ayırmak, oluşturma süresini %30–50 oranında azaltır.

Sorun 3: Çok sayıda satır. 1000+ satırla List, yavaş yükleme sayesinde hâlâ verimli çalışır, ancak düzen hesaplaması nedeniyle ilk yükleme yavaşlayabilir. Çözüm: List özelliklerinin (kaydırma, bölümler) gerekli olmadığı tek tip satırlara sahip listeler için yalnızca LazyVStack kullanın. Tam özellikli listeler için List en iyi seçim olmaya devam ediyor.

Sıkça Sorulan Sorular

SwiftUI'de List nedir?

List, SwiftUI'de kaydırılabilir bir veri listesi görüntülemek için bir kapsayıcı View'dir. Bildirimsel bir API ile UIKit'teki UITableView'in eşdeğeridir. Bölümleri, kaydırma eylemlerini, çekerek yenilemeyi, düzenlemeyi ve .listStyle() aracılığıyla özelleştirmeyi destekler.

List, ScrollView + VStack'ten nasıl farklıdır?

List yavaş yükleme ve hücre yeniden kullanımı kullanır — hücreler kaydırdıkça oluşturulur. ScrollView + VStack tüm View'ları bir kerede oluşturur. 50+ satırlı listeler için List tercih edilir. Sabit küçük kümeler (20 öğeye kadar) için fark ihmal edilebilir düzeydedir.

List'e çekerek yenileme nasıl eklenir?

.refreshable değiştiricisini (iOS 15+) kullanın. Veri güncelleme mantığına sahip bir async closure iletin. SwiftUI otomatik olarak bir yükleme göstergesi görüntüler ve async işlem tamamlandıktan sonra onu gizler.

List'te satırlar nasıl gruplanır?

Bir başlık ve isteğe bağlı footer ile Section View kullanın. Liste satırlarını Section içine yerleştirin. Dinamik bölümler için groupedData ile ForEach kullanın. iOS benzeri bir görünüm için liste stili .listStyle(.insetGrouped) ile yapılandırılır.

Çok sayıda satırı olan List nasıl hızlandırılır?

Veriler için yapılar (değer türleri) kullanın, karmaşık hücreleri EquatableView ile ayrı View'lara çıkarın, her satırda sık durum güncellemelerinden kaçının. 1000+ satırlı listeler için List özellikleri gerekli değilse LazyVStack'i değerlendirin.

Özet

  • List — yavaş yükleme ve hücre yeniden kullanımı ile kaydırılabilir liste için kapsayıcı
  • ForEach — List'te verileri dinamik olarak görüntülemenin ana yolu
  • Section — başlıklar ve footer ile satırları gruplama
  • swipeActions — iOS 15+ için kaydırma eylemleri
  • refreshable — iOS 15+ için çekerek yenileme
  • Stiller — .listStyle() ile insetGrouped, plain, inset, sidebar
  • Performans — Identifiable, EquatableView ve değer türlerini kullanın

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ış

Ayrıca okuyun