Ответ
MVC (Model-View-Controller)
- Model: Хранит данные и бизнес-логику.
- View: Отображает интерфейс, пассивна.
- Controller: Обрабатывает пользовательский ввод, обновляет Model и View. В iOS
UIViewControllerчасто становится "массивным" (Massive View Controller), так как поглощает слишком много логики. - Связь: View и Model общаются через Controller.
MVP (Model-View-Presenter)
- Presenter: Заменяет Controller, содержит всю логику отображения. Не зависит от UIKit/AppKit.
- View: Пассивна, реализует протокол для обновления UI.
- Ключевое: Четкое разделение, Presenter легко тестируется.
// View Protocol protocol GreetingViewProtocol: AnyObject { func setGreeting(text: String) }
// Presenter class GreetingPresenter { weak var view: GreetingViewProtocol? let model: User func didTapButton() { let greeting = "Hello, (model.name)!" view?.setGreeting(text: greeting) // Явный вызов метода View } }
**MVVM (Model-View-ViewModel)**
* **ViewModel:** Преобразует данные Model для View. Не содержит ссылок на View.
* **View:** (ViewController/View) наблюдает за изменениями в ViewModel через биндинги (Combine, RxSwift).
* **Ключевое:** Реактивное программирование, автоматическое обновление UI.
```swift
// ViewModel
class UserViewModel {
@Published var userName: String = "" // Наблюдаемое свойство
func fetchUser() {
userName = "Jane Doe" // View автоматически обновится
}
}
// View (ViewController)
viewModel.$userName
.receive(on: DispatchQueue.main)
.assign(to: .text, on: nameLabel) // Биндинг
Сравнение:
- Связь: MVC имеет прямую связь, MVP и MVVM — нет.
- Тестируемость: MVP и MVVM тестируются лучше MVC.
- Подход: MVP — императивный (явные вызовы), MVVM — реактивный (автоматические обновления).