궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFTUI/View layout

SwiftUI : ForEach

서근
QUOTE THE DAY

“ 자동차가 컴퓨터와 같은 개발공정을 따랐다면, 롤스로이스는 100달러쯤에 살 수 있고 연비도 백만마일 정도 될거다. 하지만 일년에 한 번씩 폭발해 버리는 살인머신이 되어버릴거다. ”

- Robert X. Cringely (로버트 X. 크링글리)
Written by SeogunSEOGUN

SwiftUI : ForEach

ForEach

swift
UNFOLDED
ForEach(array, id: \.self) name in

일반적으로 ForEach를 사용하여  SwiftUI 에서 View를 반복할 수 있습니다.

TIP
 
 

ForEach를 보고 Swift시퀀스의 forEach()방식과 동일하다고 생각하기 쉽지만, 보시는 것처럼 그렇지 않습니다.

SwiftUIForEachStruct구조 이므로 보기 본문에서 직접 반환할 수 있습니다. 항목 배열을 제공하고,  각 항목을 고유하게 식별하여 값이 변경될 때 업데이트하는 방법을 알 수 있습니다. 또한 루프의 각 항목에 대한 뷰를 생성하기 위해 실행할 클로저를 전달합니다.

 

아래 코드는 1부터 10까지 row값이 화면에 나타나도록 하는 코드입니다.

swift
UNFOLDED
Form {
ForEach(1..<10) { number in
Text("Row \(number)")
}
}

이 코드보다 더 간단하게 사용하는 방법은 Text("Row \(number")을 ($0) 값을 사용 하면 됩니다.

swift
UNFOLDED
Form {
ForEach(1..<100) {
Text("Row \($0)")
}
}

배열의 각 요소를 고유하게 식별

id: \.self부분은 SwiftUI가 배열의 각 요소를 고유하게 식별할 수 있도록 하기 위해 필요합니다. 즉, 항목을 추가하거나 제거하면 SwiftUI가 정확히 어떤 요소를 알고 있는지 확인할 수 있습니다.

 

이 접근 방식을 사용하여 모든 유형의 루프를 만들 수 있습니다. 예를 들어, 다음 코드는 세 가지 색상의 배열을 생성하고, 모든 색상을 반복하며, 각 색상 이름과 색상 값을 사용하여 텍스트 뷰를 생성합니다.

swift
UNFOLDED
struct ContentView: View {
@State var arr1: [String] = ["하나", "둘", "셋"]
@State var arr2: [String] = ["넷", "다섯", "여섯"]
var body: some View {

body 아래에 List 형식으로 Section을 사용하여 반복문을 만들어 보겠습니다.

swift
UNFOLDED
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)
}
}
}

SwiftUI : ForEach - ForEach - 배열의 각 요소를 고유하게 식별

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

swift
UNFOLDED
.textCase(nil)

SwiftUI : ForEach - ForEach - 배열의 각 요소를 고유하게 식별

전체 코드

swift
UNFOLDED
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문을 사용할 수 있습니다.

swift
UNFOLDED
struct ContentView: View {
let people = ["서근", "슬기", "나비", "희진"]
var body: some View {
List {
Section(header: Text("이름")) {
ForEach(people, id: \.self) {
Text($0)
}
}
}
}
}

SwiftUI : ForEach - ForEach - 전체 코드

혹은 아래와 같이 만들수도 있죠. people.indices[각주:1]

swift
UNFOLDED
struct ContentView: View {
let people: [String] = ["서근", "희진", "미진"]
var body: some View {
VStack {
List {
Section(header: Text("이름")) {
ForEach(people.indices) { index in
Text("\(people[index])")
}
}
}
}
}
}

세 가지 색상의 배열을 생성하고, 모든 색상을 반복하며, 각 색상 이름과 색상 값을 사용하여 텍스트 뷰를 생성합니다.

swift
UNFOLDED
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))
}
}
}
}

SwiftUI : ForEach - ForEach - 전체 코드

 

 

읽어주셔서 감사합니다🤟

 

 

  1. indices란? 컬렉션을 오름차순으로 구독하는 데 유효한 인덱스입니다. [본문으로]

잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.