Ответ
SwiftUI предоставляет несколько компонентов для рендеринга коллекций, каждый со своей областью применения:
-
List– стандартный вертикальный список с нативным поведением iOS (разделители, жесты свайпа для удаления). Идеален для отображения простых строк или настраиваемых строк. Поддерживает секции, заголовки и подвалы.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) } } } -
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— когда надо ровную табличку или сетку картинок сделать. Красота, блядь, и порядок.
Вот и вся магия, выбирай с умом, а то потом будешь как Герасим — только «Му-му» говорить от безысходности.