[SwiftUI] ForEach

haram·2025년 1월 18일
0
post-thumbnail

ForEach를 사용하는 이유는 무엇일까?

UIKit같은 경우는 swift문법에서 지원하는 for문을 통해 반복되는 View를 구현할 수 있었다.

하지만 SwiftUI를 통해 View를 구현할 때는 for문을 사용할 수 없기 때문에 ForEach를 사용해야 한다.

SwiftUI는 왜 for문을 사용할 수 없을까?

SwiftUI를 한마디로 정의하면 선언적 UI를 구현하기 위한 프레임워크이다.

자세히 풀어 설명하면 View를 선언하여 생성하면 View는 상태에 따라 알아서 변화해야 한다는 것을 의미한다.

그렇다면 상태에 따라 변화하는 것과 ForEach사이에는 무슨 관계가 있을까?

만약 어떤 View의 상태가 변화한다면 이에 대해 View를 변화시켜야 한다. 그리고 이를 위해서는 SwiftUI의 뷰 시스템에서 상태변화에 따른 처리를 하기 위해 뷰를 고유하게 식별할 수 있는 방법이 필요하다.

정리하자면 ForEach는 View들이 고유 식별자(id)를 가지도록 돕는 역할을 함으로써 상태 변화에 따라 View가 자동으로 변화될 수 있도록 한다.

ForEach의 정의

RandomAccessCollection: Swift의 컬렉션 타입 중 하나로, 인덱스를 통해 임의로 접근 가능한 컬렉션을 정의하는 프로토콜.

Hashable : Swift에서 중요한 프로토콜 중 하나로, 객체를 고유하게 식별할 수 있는 해시 값을 생성할 수 있도록 함. 이 프로토콜은 주로 Set, Dictionary와 같은 컬렉션에서 객체를 고유하게 식별하고 저장하기 위해 사용

ForEach구현예제

  • categoryList배열을 사용하여 List의 각 Section을 구성하고, menuList를 사용하여 각 Section내부에서 리스트 요소를 추가하는 예제이다.
  • forEach를 사용할 때는 데이터를 구분하기 위한 id값이 필요하다. 따라서 Menu구조체 같은 경우 이를 구현하기 위해 Identifiable프로토콜을 준수하였다.
  • ForEach(menuList[i], id: .id) 에서 .id의 의미는 Menu구조체의 id프로퍼티를 식별자로 사용한다는 것을 의미한다.
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)
            }
        }
    }
}
    

0개의 댓글