MVVM DataFlow 파악을 위해 만들어 본 작은 예제 프로젝트
가져올 데이터의 구조에 맞게 생성한다.
struct Person: Identifiable {
var id = UUID()
var name: String
var email: String
var phone: String
}
*이 구조체가 Identifiable
하지 않으면 ForEach를 통해 값을 가져올 수 없으니 주의
ObservableObject 프로토콜을 채택하고 @Published로 값의 변화를 감시한다.
class PersonViewModel: ObservableObject {
@Published var people: [Person] = []
init() {
addPerson()
}
func addPerson() {
people = peopleData
}
func shuffleOrder() {
people.shuffle()
}
func reverseOrder() {
people.reverse()
}
func removeLastPerson() {
people.removeLast()
}
func removeFirstPerson() {
people.removeFirst()
}
}
// Dummy Data
let peopleData = [
Person(name: "팜 하니", email: "[email protected]", phone: "010-1234-1234"),
Person(name: "킴 민지", email: "[email protected]", phone: "010-1234-1234"),
Person(name: "해린", email: "[email protected]", phone: "010-1234-1234"),
Person(name: "혜인", email: "[email protected]", phone: "010-1234-1234"),
Person(name: "다니엘", email: "[email protected]", phone: "010-1234-1234")
]
ObservableObject
데이터를 가져올 때에는 @ObservedObject
로 선언한다.
struct MainView: View {
@ObservedObject var viewModel = PersonViewModel()
var body: some View {
ZStack(alignment: .bottom) {
ScrollView {
ForEach(viewModel.people) { person in
HStack {
Text(person.name)
.font(.title)
.fontWeight(.bold)
Spacer()
VStack(alignment: .trailing) {
Text(person.phone)
Text(person.email)
}
}
.padding(14)
}
}
Menu("Menu".uppercased()) {
// viewModel의 함수를 통해 실시간 데이터 처리가 View에 반영되는 것을 볼 수 있다.
Button("Reverse") { viewModel.reverseOrder() }
Button("Shufflle") { viewModel.shuffleOrder() }
Button("Remove last") { viewModel.removeLastPerson() }
Button("Remove first") { viewModel.removeFirstPerson() }
}
}
}
}