SwiftUI - это новый набор инструментов, представленный Apple на WWDC 2019. Согласно описанию Apple: -
SwiftUI - это инновационный, исключительно простой способ создания пользовательских интерфейсов на всех платформах Apple с помощью Swift. Создавайте пользовательские интерфейсы для любого устройства Apple, используя всего один набор инструментов и API.

Сегодня мы поймем

  • Что такое SwiftUI?
  • Зачем это нужно?
  • Наконец, разберитесь с примером кода, написанным на SwiftUI.

Итак, без промедления давайте начнем наше глубокое погружение в SwiftUI.

Что такое SwiftUI?

SwiftUI - это набор инструментов, предоставляемый Apple для программного создания пользовательского интерфейса, такого как пользовательские элементы управления, анимация, эффекты, в простой, декларативной способ. Это помогает сократить время разработчика на реализацию и делает его более читабельным, а значит, простым для понимания любым.

Зачем нам это нужно?

Так зачем нам изучать новый инструментарий, предоставляемый Apple? Что в нем такого особенного? Попробуем сейчас разобраться в этих проблемах.

Как разработчик платформы Apple, я считаю, что нам время от времени нужно писать код пользовательского интерфейса программно. Это неизбежная, но неприятная задача. Набор инструментов SwiftUI пытается решить все эти проблемы, предоставляя декларативные API-интерфейсы для создания представления, анимации и всего, что необходимо выполнить для создания пользовательского интерфейса. Давайте посмотрим на пример, чтобы прояснить ситуацию: -

Это табличное представление ясно показывает разницу в уровне абстракции и упрощения кода, которую предоставляет набор инструментов SwiftUI. При традиционном способе написания кода пользовательского интерфейса нужно уделять больше внимания КАК части, а не ЧТО части задачи. С декларативным способом SwiftUI нам не нужно заботиться о части КАК.

Это не только дает преимущество декларативного написания пользовательского интерфейса. Но также есть новая безумная функция поддержки предварительного просмотра изменений в коде в реальном времени.

Осознавая преимущества использования SwiftUI, у вас может возникнуть соблазн использовать этот новый набор инструментов напрямую. Но все же есть много темных областей, которые нам нужно исследовать.

Но все же есть много темных областей, которые нам нужно исследовать.

  • Является ли SwiftUI только слоем адаптера над компонентами UIKit для обеспечения декларативного и упрощенного способа написания кода пользовательского интерфейса?
  • Приносит ли он какие-либо преимущества или потери в производительности?
  • Когда не следует использовать набор инструментов SwiftUI?

Мы продолжим изучать SwiftUI и постараемся ответить на эти вопросы сейчас или позже. Но это важные вопросы для понимания и принятия судебных решений об использовании SwiftUI.

Давайте углубимся в код SwiftUI

Для нашего понимания мы возьмем небольшой пример кода, написанного с использованием SwiftUI.

Этот код создает единое представление с 2 метками в виде вертикального стека с некоторым стилем и цветом шрифта. Давайте пройдемся по строкам и поймем, что это значит.

Строка 1–2: Эти строки ничего не делают, а только импортируют библиотеку поддержки SwiftUI и Playground.

Строка 4: Эта строка создает структуру ContainerView, которая реализует протокол View. Протокол представления - это тип, представляющий представление SwiftUI. Давайте посмотрим на протокол просмотра.

Протокол просмотра представляет собой часть пользовательского интерфейса. При создании пользовательского представления необходимо реализовать этот протокол. Кроме того, реализуйте обязательное свойство body, чтобы предоставить контент и поведение для вашего настраиваемого представления.

Строка 5: в этой строке реализуется свойство body для определения содержимого основного представления. Что это за новое ключевое слово some?

Это непрозрачный тип результата, представленный SE-0244 и доступный в Swift 5.1 с Xcode 11. Он ведет себя как обратный универсальный. В традиционной универсальной функции вызывающая сторона решает, какие типы будут ограничены универсальными аргументами вызываемого объекта. Но с непрозрачным типом результата тип возвращаемого значения выбирается вызываемым и возвращается вызывающему объекту как абстрагированный.

Строка 6: Эта строка создает объект Vertical StackView и возвращает экземпляр. Затем этот экземпляр присваивается в качестве значения свойству body представления контейнера.

Мы ясно видим, что здесь не используется ключевое слово return. Это связано с новой функцией, добавленной в Swift5.1 Неявный возврат из функций с одним выражением SE-0255. Если замыкание содержит только одно выражение, это выражение возвращается неявно - ключевое слово return можно опустить.

Давайте посмотрим, какие все значения принимает вид VStack в своем конструкторе.

VStack принимает в своем конструкторе 2 аргумента: горизонтальное выравнивание содержимого, интервал между содержимым и содержимое, которое необходимо добавить в представление VStack. Этот тип return является не чем иным, как настраиваемым представлением, реализующим протокол представления SwiftUI.

В нашем примере кода мы берем значения по умолчанию для горизонтального выравнивания и интервала. В этой Строке 7–14 указывается значение Content для VStack, которое добавляется как подпредставление.

Строка 7–14: В этих строках мы создаем 2 TextView, которые добавляются как Content в VStack. Но как это происходит? Мы уже обсуждали, как в одно выражение не нужно добавлять return операторы, но строки 7–14 не состоят из одного выражения, и если мы добавим больше представлений, которые также будут добавлены как контент в представлении VStack.

Это результат еще одной новой функции, представленной в SwiftUI - построителей функций. Существует также параллельная презентация этой функции на языке Swift, также здесь.

Функция построителя функций, которая позволяет некоторым функциям (специально аннотированным, часто через контекст) неявно создавать значение из последовательности компонентов. Основная идея состоит в том, что результаты операторов функции собираются с использованием типа построителя. Например:-

Точно так же VStack может это сделать, потому что в его сигнатуре есть ViewBuilder построитель функций:

Ключевое слово @ViewBuilder преобразуется в структуру ViewBuilder, которая определяет, как анализировать данное выражение. Следовательно, когда мы пишем выражения для создания представлений в VStack, компилятор запускает свою магию с помощью ViewBuilder, преобразуя это на TupleView ‹(Просмотр, Просмотр)›. Таким образом, мы видим, что тип View, который VStack содержит наш пример кода, - VStack<TupleView<Text, Text>>.

Это также означает, что существует ограничение на количество представлений, которые вы можете добавить в VStack или HStack. Изучив код, я обнаружил, что у вас может быть не более 10 представлений внутри VStack или HStack. Все остальное в настоящее время не поддерживается.

Так что я надеюсь, что теперь наш пример кода имеет какой-то смысл.

Заключение

SwiftUI не только предлагает декларативный способ написания кода пользовательского интерфейса, но также показывает нам будущее Swift как языка. Такие функции, как построитель функций, Неявный возврат из функций с одним выражением, непрозрачный тип результата, - все это шаги к созданию нового мира написания декларативного кода на Swift. Давайте все примем эти новые изменения и начнем исследовать этот новый мир.

Ссылки и полезные материалы