在计算属性中设置新值

时间:2018-09-04 14:35:50

标签: swift

我声明了一个可设置和可获取的变量。在它的getter中,我有一些逻辑,但在setter中却没有。我决定使用计算属性:

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 :(得分:0)

在您的示例中,您将始终返回axlsx_styler。如果该方程式不依赖于包含Product(SOME_EQUATION)属性的类,则可以考虑将其作为工厂方法移至product中。

请注意,其Product中的设置值是递归的。

要获得真实的计算属性:

set

请注意,var product: Product? { return Product(SOME_EQUATION) } 实际上比计算属性要好,因为它适合您的情况,因为此等式仅执行一次。

编辑:

计算的属性不用于您描述的内容。设置器中没有逻辑,并且不直接使用您设置的值是错误的。

如上所述,您需要在let product = Product(SOME_EQUATION)类中以以下方式创建工厂方法:

Product

在您的课堂上,您将其用作:

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

有关计算属性的更多信息:您已经在类中具有依赖关系时使用它们,并且为了方便起见,您希望提取数据点。 如果您依赖某些参数而不是依赖关系,则最好使用参数来创建函数!

答案 1 :(得分:0)

我假设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)
  }
}