UIKit같은 경우는 swift문법에서 지원하는 for문을 통해 반복되는 View를 구현할 수 있었다.
하지만 SwiftUI를 통해 View를 구현할 때는 for문을 사용할 수 없기 때문에 ForEach를 사용해야 한다.
SwiftUI를 한마디로 정의하면 선언적 UI를 구현하기 위한 프레임워크이다.
자세히 풀어 설명하면 View를 선언하여 생성하면 View는 상태에 따라 알아서 변화해야 한다는 것을 의미한다.
만약 어떤 View의 상태가 변화한다면 이에 대해 View를 변화시켜야 한다. 그리고 이를 위해서는 SwiftUI의 뷰 시스템에서 상태변화에 따른 처리를 하기 위해 뷰를 고유하게 식별할 수 있는 방법이 필요하다.
정리하자면 ForEach는 View들이 고유 식별자(id)를 가지도록 돕는 역할을 함으로써 상태 변화에 따라 View가 자동으로 변화될 수 있도록 한다.

RandomAccessCollection: Swift의 컬렉션 타입 중 하나로, 인덱스를 통해 임의로 접근 가능한 컬렉션을 정의하는 프로토콜.
Hashable : Swift에서 중요한 프로토콜 중 하나로, 객체를 고유하게 식별할 수 있는 해시 값을 생성할 수 있도록 함. 이 프로토콜은 주로 Set, Dictionary와 같은 컬렉션에서 객체를 고유하게 식별하고 저장하기 위해 사용
struct Menu:Identifiable{
var id:String{ name }
let name:String
let price:String
let description:String
let imageUrl:String
}
let categoryList = ["인기메뉴", "양념치킨", "후라이드 치킨", "간장치킨", "파닭", "스페셜 치킨"]
let menuList:[[Menu]] = [ ... ]
List{
ForEach(0..<categoryList.count, id: \.self) { i in
Section(header: Text(categoryList[i])){
ForEach(menuList[i], id: \.id) { menu in
MenuCardView(menu: menu, action: nil)
.frame(height:100)
}
}
}
}