Вопрос проверяет знание архитектурных шаблонов для разделения ответственности между слоями приложения.
MVP разделяет представление (View) и логику (Presenter), где Presenter обновляет View через интерфейс. MVVM добавляет слой ViewModel, связывающий Model и View через биндинги или реактивность (Combine), избавляя контроллер от логики и уменьшая тесную связанность.
Model: данные и бизнес-логика.
View: отображение, интерфейс с пользователем.
Presenter: посредник, получает события от View, запрашивает данные у Model, обновляет View через протокол.
Пример:
protocol LoginView: AnyObject {
func showError(_ msg: String)
func showSuccess()
}
class LoginPresenter {
weak var view: LoginView?
func login(user: String, pass: String) {
AuthService.login(user, pass) { success in
success ? view?.showSuccess() : view?.showError("Fail")
}
}
}ViewModel: содержит данные для View, преобразует Model и предоставляет биндинги (например, @Published).
View: наблюдает за ViewModel и обновляется автоматически.
Пример (SwiftUI):
class CounterViewModel: ObservableObject {
@Published var count: Int = 0
func increment() { count += 1 }
}
struct CounterView: View {
@StateObject var vm = CounterViewModel()
var body: some View {
VStack {
Text("\(vm.count)")
Button("Add", action: vm.increment)
}
}
}MVP требует больше интерфейсов и явных вызовов обновлений.
MVVM при использовании SwiftUI/Combine даёт декларативное обновление через биндинги.
Вывод:
Выбор паттерна зависит от стека технологий: для UIKit при отсутствии реактивности часто выбирают MVP, а для SwiftUI — MVVM.