Я давно разрабатываю iOS-приложения в рамках архитектуры MVVM, и каждый раз, когда я начинаю новый проект, я стараюсь сократить расстояние между «идеальным» MVVM и моим MVVM.

На этот раз я попытаюсь приблизиться к тому, что увидел, когда искал оригинальные приложения MVVM в WPF. Я заметил, что есть два основных игрока: свойства ViewModel, которые представляют состояние View, и команды, выполнение которых запускается из View и обрабатывается в контексте ViewModel.

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

Во-первых, давайте взглянем на наш простой контроллер представления в его исходной форме (я настроил его в раскадровке):

В этом представлении пользователь введет имя в текстовое поле, нажмет кнопку «Скажи привет», после чего метка приветствия обновит свой текст.
Понятно, что ViewModel представления должен иметь два свойства (имя, приветствие) и одну команду. (скажи привет).

Таким образом, ViewModel в исходном виде будет таким:

Теперь давайте преобразуем все это в обычный вид MVVM. Мы сделаем свойства Observable и привяжем к ним метку и текстовое поле. Также мы привяжем нажатие кнопки к вызову функции sayHello.

Проверьте суть ниже

Вроде все нормально и так и есть на самом деле, но как я уже говорил должен быть Command player. Здесь команда, очевидно, sayHello, но она представлена ​​как простая функция, которая вызывается из View. Было бы лучше описать эту функцию как свойство ViewModel, чтобы мы могли связать нажатие кнопки с ней одной строкой кода.

Давайте объявим простой командный протокол.

Команда должна иметь возможность привязать сигнал к себе и выполнить некоторую логику в ответ на сигнал.
Давайте создадим конкретную реализацию этого протокола. Мы объявим класс, который будет инициализироваться с закрытием действия, и выполним его в функции выполнения.

Теперь давайте обернем нашу функцию sayHello в sayHelloCommand:

Теперь пришло время привязать нажатие кнопки к этой команде. Одна изящная строка вместо трех… Обратите внимание на строку номер 20:

Вот и все! Давайте создадим и запустим наше приложение:

Есть гораздо больше типов команд, которые вы можете создать, просто погрузитесь в них.
Спасибо за чтение!

Существует также версия проекта Combine framework: посмотрите ветку Combine-framework: https://github.com/IsaAliev/MVVM-Properties-and-Commands/tree/combine-framework

Гутхаб: