Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
SwiftUI/SwiftUI(Basic)

[Stanford] 카드게임 MVVM 적용 (미완성)

by Toughie 2023. 3. 26.

https://www.youtube.com/watch?v=--qKOhdgJAs&t=2909s 

MVVM

ContentView만 있던 기존 프로젝트에서 MVVM 패턴을 적용해 파일 관리 시작

 

ViewModel

ViewModel은 중재자 역할이기에 공유성이 강한 클래스로 설계

뷰모델 안에서 모델을 형성하는데, 뷰나 모델 등 다른 객체가 해당 모델을 변경하지 못하도록 접근제어 (Private)

Private(set)을 걸어주는 방식도 가능하고

위와 같은 코드는 model 자체가 private 하기 때문에 모델의 카드에 따로 접근할 수 있도록

카드 변수를 만들어 준 것.

 

다만 코드구성을 보면 클래스 인스턴스가 생성될 때 각 프로퍼티의 생성 순서는 랜더믹 하기 때문에..

지연 저장 속성인 lazy를 떠올렸으나, 강의에서는 타입 프로퍼티와 타입 메서드를 활용하는 방식으로 진행했음.

(클래스 밖에 전역변수, 전역함수로 설계하는 것만 피하자. 이건 재앙이다)

각 타입 프로퍼티와 타입메서드에 접근할 때 EmojiMemoryGame.emojis / EmojiMemoryGame.createMemoryGame()

이 풀네임이지만 같은 클래스 스코프 내에 있기에 생략해도 된다.

 

Model

모델에서 CardContent라는 제네릭타입을 사용함 

프로퍼티에 기본값을 주지 않았기 때문에 멤버와이즈 이니셜라이즈가 제공되지만, 로직을 위해 생성자를 따로 구현

카드 몇쌍이 필요한지? 그리고 (Int) -> CardContent 타입의 함수가 전달됨.

-> 해당 파트 다시 뜯어 볼 예정

 

또한 Card를 구조체로 구현했는데,

외부에 따로 만들면 어디에 쓰는 카드인지?가 불명확해 질 수 있기에 (만약 이것이 여러 카드게임이 있는 종합 카드게임 앱이라면)

중첩타입을 활용한 케이스. 내부에 구현하고 앞/뒤, 매치 여부, 그림(content)가 멤버로 이루어져 있음.

 

View

아직 모델과 뷰모델이 완성되지 않아서 완성 후 View와 커뮤니케이션 할 수 있도록 수정 예정.