본문 바로가기

iOS/SwiftUI

SwiftUI) 다이나믹 리스트

SwiftUI에서 다이나믹한 리스트 만들기

SwiftUI에서 ListForEach를 사용할 경우 각 요소를 어떻게 구분할지 지정해줘야한다. 즉, 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
}

이런 방식으로 ListUnique 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 프로토콜을 채택한 후에 따로 할 일은 없다.

참고