首页 > 解决方案 > 在计算属性中设置新值

问题描述

我声明了一个可设置和可获取的变量。在它的 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)
  }
}

问题出在 setter 中,编译器警告我Attemping to modify 'product' within its own setter。但我确实想将 设置newProductproduct实例变量。这样做的正确方法是什么?

标签: swift

解决方案


在您的示例中,您将始终返回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)
}

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

Product.create(for: SOME_EQUATION) 

有关计算属性的更多信息:当你的类中已经有依赖项时使用它们,并且为了方便起见,你想提取一些数据点。如果你依赖某个参数,而不是依赖,你最好做函数,带参数!


推荐阅读