Поток данных SwiftUI | Часть 1 |

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

Эта статья будет простым руководством по потоку данных swiftUI. Я попытаюсь объяснить пару оберток свойств для отправки, возврата, чтения и записи данных в swiftUI.

Оболочка свойства

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

  1. @State
  2. @Binding
  3. @ObservableObject
  4. @Опубликовано
  5. @EnvironmentObject

@Состояние

Когда нам нужно сохранить небольшой объем данных для представления, мы можем использовать оболочку свойства @State. Типы данных могут быть int, bool, string или даже strike. Он автоматически обновляет представления, использующие эти данные, при изменении значения. Государство владеет своими данными. Давайте посмотрим на пример:

Здесь у нас есть представление swiftUI с именем Counter. Как видите, у него есть переменная состояния с именем number. В теле у нас есть текст, который показывает число, и кнопка, которая увеличивает это число на 1.

Запустите его в предварительном просмотре холста, и вы увидите следующий результат:

Вот интересная часть. Кнопка «Увеличить» добавляет 1 к предыдущему числу, и в представлении «Текст» мгновенно отображается обновленное значение.

@привязка

Что, если мы хотим получить доступ к переменной состояния из другого представления. Вот где вступает в действие привязка. Она может читать и записывать переменную состояния привязки.

Здесь у нас есть дочернее представление внутри нашего родительского представления Counter с именем IncrementButtonView. Нам нужно изменить числовую переменную из дочернего представления. Для этого мы создаем переменную привязки внутри IncrementButtonView, и при создании ее экземпляра мы передаем ей переменную состояния с прикрепленным к ней знаком доллара, и вуаля! Теперь свойство numb получает управление чтением и записью над свойством number.

Как видите, результат тот же. Однако на этот раз приращение происходит с другой точки зрения.

Обратите внимание, что связанное свойство не владеет данными, а свойство состояния. Здесь IncrementButtonView не владеет данными, которые он изменяет. Это родительское представление или Counter владеет данными.

@ObservableObject

Иногда при создании приложения нам нужны значение/значения, от которых зависит несколько представлений. Например, если у вас есть план подписки и функции разблокируются на основе подписки, вам нужно проверить isSubscribed для представлений, которым это нужно. В этом случае мы можем использовать ObservableObject.

У нас есть класс, и он соответствует протоколу ObservableObject. Внутри этого класса у нас есть логическая переменная isSubscribed. Если мы не пометим его оболочкой свойства @Published, оно не будет транслировать изменение значения. Чтобы использовать класс при создании переменной, необходимо использовать оболочку свойства @ObservedObject. Таким образом, он может прослушивать и записывать опубликованные переменные.

Как видите, HomeView показывает результат на основе наблюдаемого объекта. Если мы изменим значение, это также отразится на текстовом представлении.

Однако мы хотим, чтобы несколько представлений прослушивали один и тот же экземпляр класса Subscription. Как мы это делаем?

@EnvironmentObject

Мы можем установить EnvironmentObject для представления и передать объект при создании представления. Это означало, что несколько представлений смогут получить доступ и записать в один и тот же экземпляр класса.

Здесь, когда приложение запускается, оно показывает два представления, и мы передаем переменную подписки обоим из них в качестве объекта среды. Затем мы объявляем HomeView и SubscriptionView следующим образом:

Наконец, запустите приложение и посмотрите результат.

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

Я стараюсь писать статьи о вещах, которые узнаю. Естественно, ошибки будут, хотя я стараюсь их уменьшить. Так что, не стесняйтесь, дайте мне знать, если что-то не так.