• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

SwiftUI : List ,ForEach

List - ForEach

테이블 뷰 처럼 쭉 나오는 형태

List가 있으려면 데이터가 있어야 하는데, 그런 Data Model을 직접 만든다고 했을 때 Model을 만드는 것 까지 배워보자

struct LocationInfo {
	var city = ""
	var weather = ""
}

이런 model을 가지고, 왼쪽에는 도시 이름, 오른쪽엔 날씨 정보가 나오는 List를 만들어보자

@State private var locations = [
	locationInfo(city: "seoul", weather: "rainy"),
	locationInfo(city: "daejeon", weather: "sunny"),
  locationInfo(city: "busan", weather: "cloudy")
]
List{
	HStack{ //하나의 row (cell)
	
	}
}
  • Data를 List에 녹이기 위해선 For문 - ForEach문을 많이 사용한다

  • ForEach 요구조건이 여러 개 있는데 그 중에 상황에 따라 맞는 거 쓰면 됨

      1. id: 어떤 걸 아이디로 쓸래? city? weather? / content: 클로저형태
      • 근데 city나 weather나 같은 값이 다른 데이터에 들어갈 수 있어서 id로는 적절하지 않기 때문에 이 방식 적절X

      • id라는 개념이 필요한 이유 : 하나하나 셀을 구별하기 위해서

      • locationInfo(city: "seoul", weather: "rainy") 이런 거 하나하나를 고유한 id로서 쓰겠다 -> id: \.self 라고 쓰면 됨

        • 이 때는 Hashable 프로토콜을 준수해야 함

          struct LocationInfo: Hashable {
          	var city = ""
          	var weather = ""
          }
          
      • content:는 클로저형태

        ForEach(locations, id: \.self) {location in 
          Hstack {
            Text("\(location.city)")
            Text("\(location.weather)")
          }
        }
        

        image


      1. id가 없고 content:만 있는 형태
      ForEach(locations) {location in //위에도 그렇고 여기서의 location은 그냥 맘대로 정한 것
        Hstack {
          Text("\(location.city)")
          Text("\(location.weather)")
        }
      }
      
      • 얘처럼 id가 없는데 데이터를 뿌리려면, 모델이 Identifiable 프로토콜을 준수해야 함 - 필수구현 id값 하나 생성해야 함

        struct LocationInfo: Identifiable {
          var id = UUID() // 난수 고유한 값이 자동으로 생성되게 UUID()라고 쓴 
                
        	var city = ""
        	var weather = ""
        }
        
      • 1번에서 id: \.id 라고 쓴 것과 동일함! 2번은 그걸 생략한거

      image

      1. 인덱싱 형태 - Range<Int> 부분이 있는 형태
      • 0…10 = 0 ~ 10 / 0..<10 = 0 ~ 9

        ForEach(0..<locations.count) { index in //index는 앞의 숫자값을 받아옴 (이름은 임의로 정한 것)
         HStack{
           Text("\(index + 1)")
           Text("\(locations[index].city)")
           Text("\(locations[index].weather)")
         }
        }
        
      • 인덱스 자체로 뭘 하고싶을 때 사용

      image