Установить новое значение в вычисляемом свойстве - PullRequest
0 голосов
/ 04 сентября 2018

Я объявил переменную для установки и получения. В его геттере у меня есть логика, но не в сеттере. Я решил использовать вычисляемое свойство:

var product: Product? {
   // setter
   set(newProduct) {
     // COMPILER WARNING: Attemping to modify 'product' within its own setter
     product = newProduct
   }

   // getter 
  get {
    let price = SOME_EQUATION
    return Product(price)
  }
}

Проблема в установщике, компилятор предупреждает меня Attemping to modify 'product' within its own setter. Но я хочу установить newProduct для переменной экземпляра product. Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я предполагаю, что SOME_EQUATION использует значение из product, верно? Если нет, то сеттер вообще не нужен.

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

Но отвечая на ваш вопрос: для вычисляемых свойств в экземпляре нет хранилища. Поэтому вы можете создать частное свойство и сохранить в нем значение:

private var _product: Product?
var product: Product? {
  // setter
  set(newProduct) {
     // COMPILER WARNING: Attemping to modify 'product' within its own setter
     _product = newProduct
   }

  // getter 
  get {
    let price = SOME_EQUATION(_product)
    return Product(price)
  }
}
0 голосов
/ 04 сентября 2018

В вашем примере вы всегда будете возвращать Product(SOME_EQUATION). Если это уравнение не зависит от класса, содержащего свойство product, возможно, стоит рассмотреть его как фабричный метод в Product.

Обратите внимание, что значение в его 'set является рекурсией

Чтобы получить реальное вычисляемое свойство:

var product: Product? {
    return Product(SOME_EQUATION)
}

Обратите внимание, что let product = Product(SOME_EQUATION) на самом деле лучше, чем вычисляемое свойство, если оно подходит в вашем случае, потому что это уравнение будет выполнено только один раз.

Edit:

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

Как я уже говорил выше, вам нужно создать фабричный метод в вашем Product классе как:

static func create(for someEquation: YourType) -> Product {
    return Product(someEquation)
}

И в вашем классе вы используете его как:

Product.create(for: SOME_EQUATION) 

Дополнительная информация о вычисляемых свойствах: вы используете их, когда у вас уже есть зависимости в вашем классе, и вы хотите извлечь некоторую часть ваших данных для удобства. Если вы зависите от какого-то параметра, а не от зависимости, вам лучше сделать функцию, принимая параметр!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...