![](https://habrastorage.org/getpro/habr/upload_files/cd4/085/459/cd40854595b4d661c5fa7d2733d83dee.png)
Всем привет, с вами я, Наиль Габутдинов, iOS разработчик.
Apple выпустила первый SwiftUI в 2019 году, предлагая тем самым новый подход создания приложений в декларативном стиле. SwiftUI 4.0, представленный этим летом на WWDC 2022 вместе с iOS 16 и macOS 13 включает в себя много нововведений для более качественных и универсальных приложений под разные платформы Apple с меньшим количеством кода.
Давайте посмотрим, что нового.
Swift Charts
![](https://habrastorage.org/getpro/habr/upload_files/25f/101/e71/25f101e7105cd3cf25840c62f916bff4.png)
Swift Charts — это целый фреймворк, который позволяет преобразовывать данные в информативные и настраиваемые графики и диаграммы с очень небольшим количеством кода. Теперь можно создавать линейные графики, гистограммы или точечные диаграммы. Фреймворк позволяет гибко настраивать визуализацию данных по всевозможным параметрам а также добавлять анимации.
Доступные виды графиков: BarMark, LineMark, AreaMark, PointMark, RectangleMark, RuleMark. Рассмотрим некоторые поближе:
BarMark используется для создания гистограммы по значениям x и y.
![](https://habrastorage.org/getpro/habr/upload_files/7e0/66c/a7f/7e066ca7f8fb955d466497fe2a740a05.png)
LineMark используется для создания линейного графика. Поменяв BarMark на LineMark, можем преобразовать гистограмму в линейную диаграмму.
![](https://habrastorage.org/getpro/habr/upload_files/1f4/b03/345/1f4b03345ae71c9038b7fe89282c061f.png)
Charts API настолько гибок, что вы можете накладывать несколько диаграмм в одном view. Вот пример:
![](https://habrastorage.org/getpro/habr/upload_files/755/4cf/68e/7554cf68e001db5c51c3272084e2d28f.png)
Навигация
Пожалуй, одним из самых проблемных мест SwiftUI до iOS 16 была навигация: отсутствовал доступ к стеку навигации, было невозможно разделить UI и слой навигации, возникали случайные проблемы с работой NavigationView. Компонент NavigationView стал deprecated в iOS 16 и заменен на NavigationStack и NavigationSplitView. Основные изменения в API навигации позволяют добавлять и убирать view из стека, гибко управлять роутингом между view, программно делать data-driven структуру экранов и переходов в приложении.
NavigationStack
NavigationStack работает аналогично старому NavigationView. Чтобы реализовать простой push-переход из списка, мы можем использовать стек со списком, в котором лежат NavigationLink.
![](https://habrastorage.org/getpro/habr/upload_files/83d/58c/be3/83d58cbe3a28daee25b5891032ced9ac.gif)
NavigationLink тоже обновилась. Вместо прямого указания destinationView теперь она может принимать в качестве параметра value, а целевой view может объявляться в модификаторе navigationDestination стэка в зависимости от этого value. В приведенном ниже коде у нас есть три модификатора navigationDestination один для текстового элемента, второй для элемента целочисленного типа и третий для элемента типа Color.
![](https://habrastorage.org/getpro/habr/upload_files/a01/d02/b09/a01d02b094d3b896fc09b547c574931f.gif)
NavigationSplitView
Появилась новая структура NavigationSplitView, которая позволяет организовать Master-Detail интерфейс для iPad или Mac в два или три столбца. При этом она будет автоматически трансформироваться в привычный поэкранный интерфейс для iPhone или Apple Watch, что очень удобно, можно делать одну навигацию для разных платформ.
![](https://habrastorage.org/getpro/habr/upload_files/429/9c7/319/4299c73196340270a3c662f0dca9f70f.png)
Новый навигационный API из SwiftUI 4.0 выглядит как более удобное и гибкое решение упрощающее работу с диплинками. К сожалению, как и большинство обновлений, новая навигация SwiftUI доступна только для iOS/iPadOS 16
Новые View и Controls
Многострочные TextField
В SwiftUI 4 решена еще одна раздражающая проблема: возможность создания многострочных текстовых полей с плейсхолдерами. Теперь, используя модификатор lineLimit, это сделать просто.
![](https://habrastorage.org/getpro/habr/upload_files/b0a/28c/61f/b0a28c61f443941888946a158df9b5fb.png)
TextView будет расширяться по мере заполнения пока не достигнет максимального количества строк. Если пользователь продолжит вводить текст на новые строки, то поле станет прокручиваемым не увеличиваясь в размере. Используя три точки мы можем установить минимальное и максимальное число строк, чтобы определить минимальную и максимальную высоту текстового поля.
![](https://habrastorage.org/getpro/habr/upload_files/9de/1f3/791/9de1f3791c4b636836e6319ec37a6612.png)
MultiDatePicker
SwiftUI также порадовал нас новым компонентом с множественным выбором дат в календаре, который можно добавить в несколько строк кода:
![](https://habrastorage.org/getpro/habr/upload_files/2db/286/d23/2db286d2331cc57148260a463bce16a8.png)
Gauge
Представлен новый view, называемый Gauge, он используется для отображения прогресса в разных форматах. Вот простой способ добавить его:
![](https://habrastorage.org/getpro/habr/upload_files/494/c5d/769/494c5d7694a7003f9224ddebbba69bd5.png)
Можно указать текущее, минимальное и максимальное значения, чтобы они отображались в режиме просмотра прогресса.
![](https://habrastorage.org/getpro/habr/upload_files/cf9/419/e98/cf9419e9812adf53f519b4515b6ec1d9.png)
Можно, например, поменять стиль на круговой:
![](https://habrastorage.org/getpro/habr/upload_files/bb5/af3/9d0/bb5af39d05045800007821742fe66493.png)
ShareLink
В SwiftUI представлена новая ShareLink, которая позволяет легко добавить меню шеринга. Установка потребует минимум кода, ниже пример:
![](https://habrastorage.org/getpro/habr/upload_files/c24/c87/436/c24c874369aae6d683655e9cd5b90471.png)
AnyLayout
Новая версия SwiftUI предоставляет компонент AnyLayout, который соответствует протоколу Layout. С его помощью разработчики создают индивидуальные и сложные макеты. Вы можете использовать AnyLayout для создания динамического лэйаута, который реагирует на действия пользователей или изменения среды (размеров и ориентаций экрана).
В примере ниже при нажатии, Layout переключается с вертикального на горизонтальный, и расположение в нем прямоугольников динамически меняется:
![](https://habrastorage.org/getpro/habr/upload_files/d72/1d4/587/d721d458743ec96d993107f245e2cd14.gif)
Обратите внимание, что начиная с Xcode 14, VStack и HStack не соответствуют протоколу Layout, как указывалось ранее. Для условных лэйаутов теперь можно использовать VStackLayout и HStackLayout.
Вывод
В этом году Apple снова сделала значительное обновление SwiftUI. Charts API, переработанная навигация, появление AnyLayout и другие нововведения определенно помогут нам делать код интерфейсов более элегантным и универсальным. Надеюсь, что при этом радикально снизится количество проблем с базовыми вещами, с которыми мы сталкивались в ранних версиях SwiftUI, и работа приложений на этой современной и декларативной технологии станет стабильней.
Я продолжаю изучать новые возможности API SwiftUI и буду рассматривать их более подробно в следующих статьях.