我声明了一个可设置和可获取的变量。在它的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
实例变量。正确的方法是什么?
答案 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)
}
}