Какие компоненты SwiftUI используются для отображения коллекций данных?

Ответ

SwiftUI предоставляет несколько компонентов для рендеринга коллекций, каждый со своей областью применения:

  1. List – стандартный вертикальный список с нативным поведением iOS (разделители, жесты свайпа для удаления). Идеален для отображения простых строк или настраиваемых строк. Поддерживает секции, заголовки и подвалы.

    List(items) { item in
        Text(item.title)
    }
  2. ForEachне визуальный контейнер, а структура данных, которая генерирует представления из коллекции. Используется внутри других лэйаутов (VStack, HStack, ScrollView). Требует, чтобы данные были Identifiable.

    VStack {
        ForEach(items) { item in
            RowView(item: item)
        }
    }
  3. ScrollView с LazyVStack/LazyHStack – решение для кастомных, сложносоставных макетов (например, ленты). Lazy-стэки загружают элементы по мере необходимости, что эффективно для длинных списков, но они не переиспользуют ячейки как UITableView.

    ScrollView {
        LazyVStack {
            ForEach(items) { item in
                CardView(item: item)
            }
        }
    }
  4. Grid (iOS 16+) – система для создания выровненных сеток с помощью контейнеров Grid и строк GridRow.

    Grid {
        ForEach(items) { item in
            GridRow {
                Image(systemName: item.icon)
                Text(item.name)
            }
        }
    }

Выбор компонента:

  • Используйте List для типичных списков настроек или данных.
  • Используйте ScrollView + LazyVStack для максимально кастомного дизайна ленты.
  • Используйте Grid для выровненных табличных данных или сеток изображений.

Ответ 18+ 🔞

А, слушай, смотри, тут у нас в SwiftUI, блядь, целый зоопарк компонентов для вывода кучи данных, и каждый — со своей, сука, спецификой. Разберём, чтобы не путаться, как последний идиот.

Первый зверь — List. Это типа наш родной, блядь, стандартный список, как в настройках айфона. Всё там есть: разделители, свайпы для удаления — красота, ёпта. Идеален, когда тебе надо просто строки показать или что-то похожее. Секции, заголовки, подвалы — всё поддерживает, не парься.

List(items) { item in
    Text(item.title)
}

Второй — ForEach. Стой, не обманывайся! Это вообще не визуальный компонент, а так, структура данных, которая плодит вьюхи из коллекции. Его, сука, внутрь других контейнеров пихают — в VStack, HStack или ScrollView. И да, требует, чтобы данные были Identifiable, иначе начнёт орать, как продавщица в овощном.

VStack {
    ForEach(items) { item in
        RowView(item: item)
    }
}

Третий вариант — ScrollView с LazyVStack или LazyHStack. Вот это, блядь, мощь для кастомных, навороченных лент, где дизайн — твой самый главный уёбок. Lazy-стэки грузят элементы по мере надобности, что для длинных списков — просто песня. Но, внимание, ёпта, они не переиспользуют ячейки как старый добрый UITableView! Так что если ты наделаешь там сложных вьюх, можешь получить тормоза, как у телеги с квадратными колёсами.

ScrollView {
    LazyVStack {
        ForEach(items) { item in
            CardView(item: item)
        }
    }
}

Четвёртый, с iOS 16 — Grid. Наконец-то, блядь, нормальная система для сеток! Работает через контейнер Grid и строки GridRow. Всё ровненько, красиво, как по линеечке.

Grid {
    ForEach(items) { item in
        GridRow {
            Image(systemName: item.icon)
            Text(item.name)
        }
    }
}

Итог, куда что тыкать:

  • List — для обычных списков, типа настроек или простых данных. Нативное поведение, меньше геморроя.
  • ScrollView + LazyVStack — когда дизайн твоей ленты такой, что сам Леонардо да Винчи обзавидуется, и нужно полное управление.
  • Grid — когда надо ровную табличку или сетку картинок сделать. Красота, блядь, и порядок.

Вот и вся магия, выбирай с умом, а то потом будешь как Герасим — только «Му-му» говорить от безысходности.