> Что такое MVVM и в чем отличие от MVC (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Московская биржа, SimbirSoft, Aston, Bip.ru, Doubletapp, Masterdata, ООО "ШВЕЦОВ", BSL

Стек: iOS, Swift

> Пример ответа

Короткий ответ

MVVM и MVC - это архитектурные паттерны для разделения ответственности в приложении. В MVC контроллер управляет потоком данных между моделью и view, а в MVVM viewModel заменяет контроллер и предоставляет view готовые данные через binding. Основное отличие - в MVVM view не знает о модели напрямую, а viewModel не зависит от view, что упрощает тестирование и переиспользование логики.

Подробное объяснение

MVC (Model-View-Controller) - классический паттерн, где:

  • Model - данные и бизнес-логика
  • View - отображение (в iOS это UIView и UIKit)
  • Controller - посредник, который обновляет view при изменении модели и передает действия пользователя в модель

В iOS MVC часто превращается в Massive View Controller, потому что контроллер берет на себя слишком много: обработку событий, обновление UI, сетевые запросы, навигацию.

MVVM (Model-View-ViewModel) - эволюция MVC:

  • Model - та же модель данных
  • View - отображение, но оно не содержит логики, только привязку к viewModel
  • ViewModel - содержит состояние экрана, преобразует данные модели в формат для отображения, обрабатывает действия пользователя

Ключевое отличие - направление зависимостей. В MVC контроллер знает и о view, и о модели. В MVVM viewModel не знает о view, а view подписывается на изменения viewModel через binding (например, с помощью Combine, RxSwift или делегатов).

Еще одно отличие - тестируемость. ViewModel можно юнит-тестировать без UI, а контроллер в MVC сложно тестировать без создания view.

На практике

В iOS-разработке MVVM чаще используют с фреймворками реактивного программирования (Combine, RxSwift), но можно реализовать и без них - через замыкания или делегаты.

Пример типичной структуры MVVM-экрана:

  • ViewController - только настройка UI и подписка на viewModel
  • ViewModel - input (методы для действий пользователя) и output (published properties или замыкания)
  • Model - структуры данных, сетевой слой

В MVC контроллер обычно напрямую вызывает методы модели и обновляет view вручную, что приводит к сильной связанности.

Пример кода

Простой пример MVVM на Swift с использованием замыканий:

SWIFT
// Model
struct User {
let name: String
let age: Int
}
// ViewModel
final class UserViewModel {
private let user: User
var displayName: String {
"\(user.name), \(user.age) лет"
}
var onDataChanged: (() -> Void)?
init(user: User) {
self.user = user
}
func updateAge(_ newAge: Int) {
// обновление модели и уведомление view
onDataChanged?()
}
}
// View (ViewController)
final class UserViewController: UIViewController {
private let viewModel: UserViewModel
private let nameLabel = UILabel()
init(viewModel: UserViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
viewModel.onDataChanged = { [weak self] in
self?.nameLabel.text = self?.viewModel.displayName
}
nameLabel.text = viewModel.displayName
}
}

В MVC тот же код выглядел бы так: контроллер сам создавал модель, сам обновлял label и обрабатывал действия.

Как отвечать на собеседовании

Начни с краткого определения обоих паттернов. Затем выдели главное отличие - направление зависимостей и роль посредника. Упомяни проблему Massive View Controller в MVC. Расскажи про тестируемость MVVM. Если спросят про реализацию - покажи простой пример с замыканиями или Combine. Для junior достаточно понимания концепции и умения объяснить разницу на пальцах.

Что проверяет интервьюер

  • Понимание принципов разделения ответственности
  • Умение объяснить, зачем нужны архитектурные паттерны
  • Знание ограничений MVC в iOS
  • Понимание, как работает binding в MVVM
  • Способность привести конкретный пример из практики

Типичные ошибки

  • Путать ViewModel с Model - viewModel не хранит данные, а преобразует их для отображения
  • Говорить, что MVVM всегда требует RxSwift или Combine - это не так, можно использовать замыкания
  • Не упоминать проблему Massive View Controller - это ключевой аргумент в пользу MVVM
  • Считать, что MVVM полностью решает все проблемы - навигация и lifecycle остаются сложными
  • Путать MVVM с VIPER или Clean Architecture - это разные уровни абстракции

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью