В предыдущей статье мы рассмотрели, как мы можем использовать шаблон делегата, чтобы отделить наши представления от наших контроллеров. Сегодня мы погрузимся в мир Property Observers, чтобы увидеть, как мы можем использовать их, чтобы упростить работу с нашими объектами.

Что такое Property Observer?

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

- Руководство по языку быстрого программирования

Приведенное выше объяснение говорит само за себя. Объявляя Property Observer, мы делаем это, потому что нам интересно знать, когда изменяется определенное значение. Как говорится в цитате, «изменение» не обязательно означает изменение фактического значения. Идея состоит в том, чтобы наблюдать за записью переменной, что может быть очень полезным. Помимо наблюдения и уведомления нас об изменении, мы также можем выбрать, в какой момент времени мы хотели бы получать уведомление, выбрав willSet (до записи) и / или didSet (после записи) наблюдателей.

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

Контроль и принудительное применение домена переменной

Чтобы отслеживать наш прогресс, мы будем использовать нормализованное значение типа Double. Нормализация в этом контексте означает, что мы собираемся хранить число x, такое, что 0 ≤ x ≤ 1. Этот подход имеет целый ряд плюсов, особенно при работе с графикой. Он также отвечает за проверку установленных значений, чтобы они оставались в пределах домена. Давайте посмотрим, как Property Observer может помочь нам в этом:

class ProgressBar {
  public var progress: Double = 0 {
    didSet {
      self.progress = min(max(self.progress, 0), 1)
      print("Set new progress to \(self.progress).")
    }
  }
}

var p = ProgressBar()
p.progress = 2
// Prints "Set new progress to 1.0"
p.progress = 0.2
// Prints "Set new progress to 0.2"
p.progress = -100
// Prints "Set new progress to 0.0"

Это неплохо. Используя наблюдатель didSet, мы можем убедиться, что значение прогресса всегда остается в пределах своих границ. Мы также могли бы добиться такого поведения, создав вычисляемое свойство с резервным хранилищем и используя setter, но это тема для другой статьи.

Упрощение использования для других разработчиков

Давайте подумаем, как будет вести себя наш настраиваемый индикатор выполнения, когда он будет встроен в наше приложение. Помимо настройки прогресса, нам также необходимо анимировать полосу и настроить нашу метку для отображения нового процентного значения. Оба эти действия полагаются исключительно на нашу переменную progress для выполнения своей работы. Это также действия, которые нужно выполнять только при обновлении хода выполнения, поэтому нет реальной необходимости делать функцию обновления доступной для внешних разработчиков. Разве не было бы проще, если бы они могли просто установить новое значение прогресса и покончить с этим? Конечно было бы!

class ProgressBar {
  public var progress: Double = 0 {
    didSet {
      self.progress = min(max(self.progress, 0), 1)
      animateBar()
      updateLabel()
    }
  }
  
  private func animateBar() {
    // Perform a flashy animation to the new progress value
  }
  
  private func updateLabel() {
    // Update your label text
  }
}

Сейчас мы говорим. Подумайте о том, что увидят другие разработчики, когда воспользуются вашей полосой выполнения. Для них будет установлена ​​одна переменная (что очень легко даже для новичков), и когда они это сделают, они позаботятся о каждом необходимом визуальном обновлении. Представьте, как вы можете сделать это еще более настраиваемым, позволив разработчикам выбирать цвета, ширину линий и другие параметры при инициализации. Вы по-прежнему могли выставлять переменную progress только наружу, так что с ней было бы приятно работать!

Несколько слов о параметрах наблюдателя

При объявлении Property Observer у вас также будет доступ к новому или старому значению переменной. Имя по умолчанию для нового значения в willSet - просто newValue, а старое значение в didSet по той же логике называется oldValue. Вам разрешено переименовывать эти параметры, добавляя новое имя при объявлении наблюдателей, например:

public var someInt: Int = 0 {
  willSet(newInt) {
    // Parameter is now named newInt
  }
  didSet(originalInt) {
    // Parameter is now named originalInt
  }
}

На этот раз все! Не стесняйтесь комментировать, если у вас есть вопросы, и подписывайтесь, чтобы получать уведомления о будущих статьях.

Чтобы узнать больше о разработке для iOS, ознакомьтесь с моими предыдущими статьями:





Эта история опубликована в The Startup, крупнейшем предпринимательском издании Medium, за которым следят +414 678 человек.

Подпишитесь, чтобы получать наши главные новости здесь.