Published on

ForEach

Authors

List massiv va closure oladi β€” bu aslida ichida ForEach ishlatib ishlaydi. Lekin ba'zida ForEach-ni to'g'ridan-to'g'ri ko'rsatish kerak bo'ladi β€” masalan, statik qatorlar orasiga dinamik qatorlar qo'shish, yoki ScrollView ichida to'liq layout nazoratini saqlab aylanish imkonini berish uchun.

ForEach β€” view builder bo'lib, massivdagi har bir element uchun view yaratadi. U konteyner emas: scroll qilmaydi, qator uslubini bermaydi. Uni List, VStack, ScrollView yoki boshqa konteyner ichiga joylashtirasiz.

Asosiy qoida: ForEach faqat view-lar generatsiya qiladi, qolgan hamma narsani ota-ona konteyner bajaradi.

Swift
ContentView.swift
import SwiftUI struct ContentView: View { @State private var mevalar = ["Olma", "Banan", "Nok", "Uzum", "Apelsin"] var body: some View { NavigationStack { List { // ForEach massivdan qatorlar generatsiya qiladi ForEach(mevalar, id: \.self) { meva in Text(meva) } // Swipe-to-delete: foydalanuvchi chapga siljitsa qizil o'chirish tugmasi chiqadi .onDelete { indexSet in mevalar.remove(atOffsets: indexSet) } } .navigationTitle("Mevalar") // EditButton avtomatik Edit/Done ni boshqaradi .toolbar { EditButton() } } } }

ForEach variantlari

ForEach(.indices) β€” indeks bilan kirish

ForEach(kitoblar.indices, id: \.self) { i in
    HStack {
        Text("\(i + 1).")
            .foregroundStyle(.secondary)
        Text(kitoblar[i].nomi)
    }
}

Elementning tartib raqamiga yoki indeksiga kirish kerak bo'lganda .indices ishlating. id: \.self indeksning o'zi noyob bo'lgani uchun kerak.

.onMove β€” qayta tartiblash

List {
    ForEach(vazifalar) { vazifa in
        Text(vazifa.nomi)
    }
    .onMove { from, to in
        vazifalar.move(fromOffsets: from, toOffset: to)
    }
}
.toolbar { EditButton() }

Edit mode yoqilganda qatorlar yonida uch chiziqli siljitish tutqichi paydo bo'ladi. EditButton() yoki .environment(\.editMode, .constant(.active)) edit mode-ni yoqadi.

ScrollView ichida ForEach

ScrollView {
    VStack(spacing: 12) {
        ForEach(kartalar) { karta in
            KartaView(karta: karta)
                .padding(.horizontal)
        }
    }
}

Qator separatorlari va inset marginsiz to'liq layout nazorati kerak bo'lganda ScrollView + VStack + ForEach kombinatsiyasini ishlating. Kartalar, feed-lar va maxsus layoutlar uchun ideal.

ForEach an'anaviy tsikl emas: U Swift-dagi for tsikl kabi ish vaqtida bajarilmaydi. Bu β€” ko'rsatish uchun view-lar guruhini tasvirlovchi SwiftUI view. Bu farq ishlash unumdorligi va joylashuv haqida o'ylayotganingizda muhim ahamiyat kasb etadi.

Qo'shimcha variantlar

ForEach inside VStack

ForEachni VStack ichida ishlating β€” tizim ro'yxat stilisiz vertikal joylashuv uchun. Kartalar, yorliq bulutlari yoki maxsus joylashuvlar uchun qulay.

var body: some View {
    VStack(alignment: .leading) {
        // Views are stacked vertically, no scrolling, no separators
        ForEach(fruits, id: \.self) { fruit in
            Text(fruit)
                .padding(.vertical, 4)
        }
    }
}

ForEach inside List with extra static rows

List ichida ForEach ni aniq ishlatishning asosiy sababi: dinamik kontent bilan statik qatorlar, sarlavhalar, pastki qatorlarni aralashtirib ishlatish mumkin.

List {
    // A static row above the dynamic content
    Text("Today's picks")
        .font(.headline)

    // ForEach generates one row per fruit
    ForEach(fruits, id: \.self) { fruit in
        Text(fruit)
    }

    // Another static row below
    Text("End of list")
        .foregroundStyle(.secondary)
}

ForEach with identifiable struct

List kabi, agar modelingiz Identifiable bo'lsa id: parametrni o'tkazib yuborishingiz mumkin. Bu haqiqiy SwiftUI kod bazalarida eng keng tarqalgan pattern.

struct Book: Identifiable {
    let id = UUID()
    let title: String
    let author: String
}

List {
    // No id: parameter needed β€” ForEach finds it via Identifiable
    ForEach(books) { book in
        Text(book.title)
    }
}

ForEach with index using enumerated

Ma'lumot bilan birga qator raqamini ham olish uchun .indices ishlating. Elementlar o'chirilishi mumkin bo'lgan ro'yxatlarda muammo chiqarishi mumkin β€” faqat o'qish uchun ro'yxatlarda ishlating.

List {
    // indices gives you 0, 1, 2... β€” useful when you need the position
    ForEach(fruits.indices, id: \.self) { index in
        // Access the element using the index
        Text("\(index + 1). \(fruits[index])")
    }
}

Tezkor ma'lumotnoma

SintaksisVazifasi
ForEach(massiv, id: \.self)Hashable elementlar uchun
ForEach(massiv)Identifiable elementlar uchun
ForEach(massiv.indices, id: \.self)Indeks kerak bo'lganda
.onDelete { indexSet in }Swipe-to-delete β€” ForEach-ga qo'llanadi
.onMove { from, to in }Edit mode-da qayta tartiblash

Topshiriq: tahrirlash mumkin ro'yxat

@State massiv yarating. List + ForEach bilan ko'rsating. .onDelete qo'shing. .onMove qo'shing. Toolbarga EditButton() qo'shing. Simulyatorda swipe-to-delete va drag-to-reorder-ni sinab ko'ring.

Buy mea coffee