본문 바로가기

SwiftUI

SwiftUI ForEach

반응형

SwiftUI는 ForEach라고 하는 전용 뷰 타입을 제공해준다. 

반복해서 뷰를 만들기 위해 가장 많이 사용하는 방법이다. 

 

공식문서를 보면 다음과 같이 나타나 있다. 

A structure that computes views on demand from an underlying collection of identified data.

식별된 데이터의 컬렉션에서 요청 시, 뷰를 계산하는 구조체

 

 

 ForEach는 루프를 돌면서 한 번의 클로저를 계속해서 실행한다. 

struct ForEachPractice: View {
    var body: some View {
        Form {
            ForEach(0..<100) { number in
                Text("열 \(number)")
            }
        }
    }
}

또한 ForEach는 클로저로 전달되기 때문에 파라미터 이름을 축약할 수 있다. 

struct ForEachPractice: View {
    var body: some View {
        Form {
            ForEach(0..<100) {
                Text("열 \($0)")
            }
        }
    }
}

 

 

ForEach는 다음과 같은 상황에서 유용하게 쓰일 수 있다. 

struct ForEachPractice: View {
    let names = ["철수", "영희", "진구"]
    @State private var selectedName = "진구"
    
    var body: some View {
        NavigationView {
            Form {
                Picker("너의 이름은", selection: $selectedName) {
                    ForEach(names, id: \.self) {
                        Text($0)
                    }
                }
            }
        }
    }
}

  • names는 상수이기 때문에 변화하지 않기 때문에 @State를 붙일 필요가 없다. 
  • 반면 selectedName은 상태(value)가 바뀌기 때문에 @State를 붙여준다. 
  • ForEach에서 보이는 id: \.self는 SwiftUI가 화면의 모든 뷰를 고유하게 식별할 수 있어야하기 때문에 데이터를 식별하기 위한 id값이다. 때문에 변화를 감지할 수 있다. 

SwiftUI는 각 동적 뷰를 고유하게 식별하는 방법을 알아야 변경 사항을 올바르게 나타낼 수 있다. 

ForEach를 사용해서 뷰를 만들 떄 문자열 배열의 각 항목을 고유하게 만드는 식별자가 \.self라고 할 수 있다. 

(식별자가 self라는 것은 배열 "진구"의 id를 "진구"로 정하는 것 같다.)

때문에 이러한 에러가 나타난다. 

 

 

참고

https://developer.apple.com/documentation/swiftui/foreach

 

Apple Developer Documentation

 

developer.apple.com

https://www.hackingwithswift.com/books/ios-swiftui/creating-views-in-a-loop

 

Creating views in a loop - a free Hacking with iOS: SwiftUI Edition tutorial

Was this page useful? Let us know! 1 2 3 4 5

www.hackingwithswift.com

 

반응형

'SwiftUI' 카테고리의 다른 글

SwiftUI @Binding 알아보기  (0) 2022.10.23
SwiftUI FocusState 알아보기  (0) 2022.07.26
SwiftUI animations(애니메이션)  (0) 2022.07.21
SwiftUI LifeCycle  (0) 2022.07.21
SwiftUI @AppStorage  (0) 2022.07.19