SwiftUI에서 다이나믹한 리스트 만들기
SwiftUI에서 List
나 ForEach
를 사용할 경우 각 요소를 어떻게 구분할지 지정해줘야한다. 즉, Unique Identifier
를 지정해줘야 한다. 이는 두 가지 방식으로 가능하다.
1) Key Path
List(landmarkData, id: \.id) { landmark in
LandmarkRow(landmark: landmark)
}
struct Landmark {
var id: Int
var name: String
fileprivate var imageName: String
fileprivate var coordinates: Coordinates
var state: String
var park: String
var category: Category
}
이런 방식으로 List
에 Unique Identifier
를 넘겨줄 수 있다. 이때 id
가 아니라 name
같은 아무 프로퍼티를 사용해도 되지만 꼭Unique Identifier
이어야 한다. 위 코드는 Landmark 객체를 생성할 때 직접 id를 지정하는 방식이다. 이는 Unique Identifier
라는 조건을 해칠수도 있으므로 자동으로 생성되게 할 수 있다.
struct Landmark {
let id = UUID()
var name: String
fileprivate var imageName: String
fileprivate var coordinates: Coordinates
var state: String
var park: String
var category: Category
}
UUID
를 사용하면 매번 객체가 생성될 때 Unique Identifier
를 만들 수 있다.
2) Identifiable Protocol
Identifiable
프로토콜을 채택하면 Key Path
를 따로 넘겨주지 않아도 된다.
List(landmarkData) { landmark in
LandmarkRow(landmark: landmark)
}
struct Landmark: Identifiable {
let id = UUID()
var name: String
fileprivate var imageName: String
fileprivate var coordinates: Coordinates
var state: String
var park: String
var category: Category
}
이미 id
프로퍼티가 있으므로 Identifiable
프로토콜을 채택한 후에 따로 할 일은 없다.
참고
'iOS > SwiftUI' 카테고리의 다른 글
SwiftUI) NavigationLink와 Memory Leak (2) | 2020.12.05 |
---|---|
SwiftUI) URL로 비동기 이미지 생성하기 - Combine과 Network (0) | 2020.12.05 |
SwiftUI) ViewBuilder 와 guard let (1) | 2020.12.03 |
SwiftUI) ObservableObject와 상속 (1) | 2020.12.02 |
SwiftUI) MVVM과 Combine (0) | 2020.11.24 |