ForEach creates child views from a collection, but it is not itself a scrolling container. List adds platform list behavior such as rows, selection, edit operations, separators, and accessibility conventions. ScrollView with LazyVStack or LazyVGrid is appropriate when presentation needs more control than a platform list.
Identity connects each data element to its corresponding view across insertions, removals, moves, and updates. Identifiable provides a stable ID. Never use a changing property or array index as identity for data that can reorder; SwiftUI may associate state and animation with the wrong row.
Collection screens need more than successful content. Represent loading, empty source, no search results, failure, and populated states deliberately. Apply mutations to the source collection using stable IDs rather than assuming displayed offsets match filtered data.