재사용 할 모달의 뷰 모델을 구현하기 위해 화면의 요구사항과 동작을 파악한 후, 뷰 모델의 책임을 정의해야한다.
뷰 모델을 상태 관리와 로직 처리를 담당해야 한다.
import Foundation
// MARK: - VocaBookModalMode Enum
enum VocaBookModalMode {
case create
case edit(title: String, language: Language)
}
// MARK: - Language Enum
enum Language: Int {
case korean = 0
case english
case chinese
case japanese
case german
var koreanTitle: String {
switch self {
case .korean: return "한국어"
case .english: return "영어"
case .chinese: return "중국어"
case .japanese: return "일본어"
case .german: return "독일어"
}
}
}
// MARK: - VocaBookModalViewModel Class
class VocaBookModalViewModel {
// MARK: - Properties
// 현재 모드
private(set) var mode: VocaBookModalMode
// 단어장 이름
var bookName: String = "" {
didSet {
bookNameChanged?(bookName)
}
}
// 선택된 언어
var selectedLanguage: Language = .english {
didSet {
languageSelectionChanged?(selectedLanguage)
}
}
// 언어 목록
let availableLanguages: [Language] = [.korean, .english, .chinese, .japanese, .german]
// 상태 변화 콜백
var bookNameChanged: ((String) -> Void)?
var languageSelectionChanged: ((Language) -> Void)?
var dismissModal: (() -> Void)?
// MARK: - Initialization
init(mode: VocaBookModalMode) {
self.mode = mode
switch mode {
case .create:
bookName = ""
selectedLanguage = .english
case .edit(let title, let language):
bookName = title
selectedLanguage = language
}
}
// MARK: - Methods
// 단어장 이름 변경
func updateBookName(_ name: String) {
bookName = name
}
// 언어 선택
func selectLanguage(_ language: Language) {
selectedLanguage = language
}
// 확인 버튼 동작
func confirm() {
if mode == .create {
// 단어장 추가 로직
print("단어장 추가: \(bookName), \(selectedLanguage.koreanTitle)")
} else if case .edit(let title, _) = mode {
// 단어장 수정 로직
print("단어장 '\(title)' 수정: \(bookName), \(selectedLanguage.koreanTitle)")
}
dismissModal?()
}
}
오옹 UI 깔끔해서 이쁘다,, 그리고 5개국어라니.. ㄷㄷ 기대되네요!