2강은 다루는 내용이 많아서 아마 나눠서 포스팅할 것 같다.
MVVM & Type 이론 -> Memorize 코드 실습 단계로 나뉜다.
지금은 MVVM 개념을 다루려고 한다.
MVVM은 소프트웨어 아키텍처 패턴이다. Model-View-ViewModel 약자다. MVVM 말고도 MVC, MVP도 있다. 2019년 애플에서 SwiftUI를 발표할 때 MVVM 패턴을 새로 소개하였는데 SwiftUI를 사용하려면 MVVM은 반드시 알아야한다.
우선 UI 부분과 data, logic 부분을 분리하고 싶다. 여기서 View가 UI이고 Model이 data, logic이다. 따라서 Model 코드를 작성할 때 import swiftUI 이딴 거 안 한다. 지금 만드는 카드게임을 예시로 들면 model이 갖는 내용을 다음과 같다.
Stateless
View는 Model을 반영한다. 데이터는 Model에만 존재하기 때문에 데이터는 항상 Model에서 View로 흐른다. View에서 보여주는 모든 것들은 Model이 가진 것들을 반영한다. Model이 어떤 state를 갖고 있던 View는 그것을 보여줄 뿐이다. 따라서 View는 Stateless이다.
Declarative
Declared View는 함수의 동작 순서가 바뀐다고 해서 View 생김새가 달라지지 않는다.
struct CardView: View {
var isFaceUp: Bool
var body: some View {
ZStack {
if isFaceUp {
RoundedRectangle(cornerRadius: 10.0).fill(Color.white)
RoundedRectangle(cornerRadius: 10.0).stroke(lineWidth: 3.0)
Text("👻")
} else {
RoundedRectangle(cornerRadius: 10.0).fill()
}
}
}
}
1강에서 작성한 카드 관련 코드이다. ZStack, RoundedRectangle같은 것들은 모두 화면의 생김새를 정의하는 것들이다. fill(), stroke()같은 함수 역시 생김새를 바꾸는 modifier이다.
ViewModel은 View와 Model을 이어준다. Reactive View를 만들려면 Model이 View에게 변경사항을 알려줘야하는데 이 역할을 ViewModel이 한다.
이번 강의에서는 4개만 다루고 나머지 2개는 다음 강에서 다룬다고 한다.
var foo: (Double) -> Void
여기서 foo의 type은 'Double을 input으로 받고 아무것도 return 하지 않는 function'이다.
(scala로 functional programming을 배울 때 clousre 파트에서 봤던 내용같다)
여기까지가 이론이고 여기서 배운 MVVM과 type을 이어지는 실습에서 활용한다. 실습 파트는 다음 글로 넘겨야겠다.