저번 게시글에서 MVVM
이 무엇이고 어디에 쓰는지 알아보았습니다.
이제 Xcode
에서 MVVM
을 어떻게 하용하는지 간단한 예제를 통해 알아보려고 합니다.
MVVM의 간단한 예제
새로운 Xcode
프로젝트를 생성하여 시작하도록 하겠습니다. 일반적으로 아래와 같이 생성하게 되면 Model
👉🏻 View
로 직접적으로 화면을 구성해주게 됩니다. 아래 코드를 보면 age
가 Int
로 정해져있습니다.
//Models
struct Person {
var name: String
var age: Int
}
//Views
struct ContentView: View {
let seogun = Person(name: "서근", age: 26)
var body: some View {
VStack {
Text(seogun.name)
.padding()
Text(String(seogun.age))
}
}
}
age
를 birthday
변수로 바꿔주겠습니다.
//Models
struct Person {
var name: String
var birthday: Date
}
//Views
struct ContentView: View {
let seogun = Person(name: "서근", birthday: Date())
var body: some View {
VStack {
Text(seogun.name)
.padding()
}
}
}
이제 조금 복잡해집니다. 생년월일을 나이로 변환해야 하고 그것을 넣어줘야 합니다. 그렇기때문에 우리는 ViewModel
을 만들어야 합니다. 왜 ViewModel
을 만들까요?
지금 코드를 보면 Model에서 View로 전달해줄 수 없기 때문이죠!
//ViewMdoel
class ContentViewModel: ObservableObject {
var seogun = Person(name: "서근", birthday: Date())
var name: String {
seogun.name
}
var age: String {
//Date를 -> 나이로 변환
return "27"
}
//이름변경 함수 생성
func changeName(_ name: String) {
seogun.name = name
}
}
ViewModel
을 생성해줬습니다. 코드를보면 이름, 나이, 이름변경 함수가 있습니다. 이제 이 코드를 View
에 전달해줘야합니다.
//Views
struct ContentView: View {
//ViewModel을 가져온다
@StateObject var viewModel = ContentViewModel()
var body: some View {
VStack {
Text(viewModel.name)
.padding()
Text(viewModel.age)
.padding()
Button("이름변경") {
//이름을 "포뇨"로 변경
viewModel.changeName("포뇨")
}
}
}
}
View
안에 ViewModel
을 가져오는데 @StateObject
로 가져와야 합니다. Text
쪽도 위와같이 변경해줬고, Button
을 생성해서 클릭시 이름이 '포뇨'로 바뀌게 하려고 합니다. 이렇게 하고 런을 해보면 아무 반응이 없습니다. 왜그럴까요?
ViewModeld
에 @Published
속성을 추가해주지 않았기 때문이죠 :)
//ViewMdoel
class ContentViewModel: ObservableObject {
@Published var seogun = Person(name: "서근", birthday: Date())
읽어주셔서 감사합니다🤟
'SWIFTUI > Grammar' 카테고리의 다른 글
SwiftUI : EnvironmentValues (0) | 2021.04.05 |
---|---|
SwiftUI : EnvironmentObject '뷰간에 데이터 공유' (1) | 2021.04.05 |
SwiftUI : #1 디자인 패턴 과 MVVM (Design Patterns and MVVM) (0) | 2021.02.15 |
SwiftUI : #2 ObservedObject '클릭시 값 증가' (0) | 2021.02.14 |
SwiftUI : #1 ObservedObject '간단한 타이머 만들기' (0) | 2021.02.14 |