반응형
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
https://www.hackingwithswift.com/books/ios-swiftui/creating-views-in-a-loop
반응형
'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 |