
ForEach
ForEach(array, id: \.self) name in
일반적으로 ForEach
를 사용하여 SwiftUI
에서 View를 반복할 수 있습니다.
ForEach
를 보고 Swift시퀀스의 forEach()
방식과 동일하다고 생각하기 쉽지만, 보시는 것처럼 그렇지 않습니다.
SwiftUI
의 ForEach
는 Struct
구조 이므로 보기 본문에서 직접 반환할 수 있습니다. 항목 배열을 제공하고, 각 항목을 고유하게 식별하여 값이 변경될 때 업데이트하는 방법을 알 수 있습니다. 또한 루프의 각 항목에 대한 뷰를 생성하기 위해 실행할 클로저를 전달합니다.
아래 코드는 1부터 10까지 row
값이 화면에 나타나도록 하는 코드입니다.
Form { ForEach(1..<10) { number in Text("Row \(number)") } }
이 코드보다 더 간단하게 사용하는 방법은 Text("Row \(number")
을 ($0
) 값을 사용 하면 됩니다.
Form { ForEach(1..<100) { Text("Row \($0)") } }
배열의 각 요소를 고유하게 식별
id: \.self
부분은 SwiftUI
가 배열의 각 요소를 고유하게 식별할 수 있도록 하기 위해 필요합니다. 즉, 항목을 추가하거나 제거하면 SwiftUI
가 정확히 어떤 요소를 알고 있는지 확인할 수 있습니다.
이 접근 방식을 사용하여 모든 유형의 루프를 만들 수 있습니다. 예를 들어, 다음 코드는 세 가지 색상의 배열을 생성하고, 모든 색상을 반복하며, 각 색상 이름과 색상 값을 사용하여 텍스트 뷰를 생성합니다.
struct ContentView: View { @State var arr1: [String] = ["하나", "둘", "셋"] @State var arr2: [String] = ["넷", "다섯", "여섯"] var body: some View {
body 아래에 List 형식으로 Section을 사용하여 반복문을 만들어 보겠습니다.
List { Section(header: Text("first section")) { ForEach(arr1, id: \.self) { s in Text(s) } } Section(header: Text("second section")) { ForEach(arr2, id: \.self) { s in Text(s) } } }

위 결과 화면을 보면 Section
부분 Header Text
에 소문자로 "first section"으로 지정해주었지만, 실제 결괏값은 대문자로 나와있는 것을 확인하실 수 있습니다. 이럴 때는 .textCase(nil)
값을 Section
밖에 추가하면 실제 사용자가 정해놓은 텍스트 값으로 보여주게 됩니다.
.textCase(nil)

전체 코드
struct ContentView: View { @State var arr1: [String] = ["하나", "둘", "셋"] @State var arr2: [String] = ["넷", "다섯", "여섯"] var body: some View { List { Section(header: Text("first section")) { ForEach(arr1, id: \.self) { s in Text(s) } } .textCase(nil) //대문자를 사용자가 지정한 텍스로 보여줌 Section(header: Text("second section")) { ForEach(arr2, id: \.self) { s in Text(s) } } .textCase(nil) //대문자를 사용자가 지정한 텍스로 보여줌 } } }
변수값으로 ForEach
문을 사용할 수 있습니다.
struct ContentView: View { let people = ["서근", "슬기", "나비", "희진"] var body: some View { List { Section(header: Text("이름")) { ForEach(people, id: \.self) { Text($0) } } } } }

혹은 아래와 같이 만들수도 있죠. people.indices 1
struct ContentView: View { let people: [String] = ["서근", "희진", "미진"] var body: some View { VStack { List { Section(header: Text("이름")) { ForEach(people.indices) { index in Text("\(people[index])") } } } } } }
세 가지 색상의 배열을 생성하고, 모든 색상을 반복하며, 각 색상 이름과 색상 값을 사용하여 텍스트 뷰를 생성합니다.
struct ContentView: View { let colors: [Color] = [.red, .green, .blue] var body: some View { VStack { ForEach(colors, id: \.self) { color in Text(color.description.capitalized) .font(.title) .foregroundColor(Color.white) .padding(30) //background에 ForEach에서 color in 해놓은것을 할당해준다 .background(color) .clipShape(Capsule()) .overlay(Capsule().stroke(Color.black, lineWidth: 1)) } } } }

읽어주셔서 감사합니다🤟
- indices란? 컬렉션을 오름차순으로 구독하는 데 유효한 인덱스입니다. [본문으로]
'SWIFTUI > View layout' 카테고리의 다른 글
SwiftUI : DatePicker / DateFormatter (0) | 2021.01.25 |
---|---|
SwiftUI : Stepper (onIncrement / onDecrement) (0) | 2021.01.25 |
SwiftUI : NavigationView / NavigationLink (4) | 2021.01.23 |
SwiftUI : Overlay / Background / Alignment (0) | 2021.01.22 |
SwiftUI : HStack / Spacer / minLength / Frame (2) | 2021.01.22 |