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)
}
}
问题出在 setter 中,编译器警告我Attemping to modify 'product' within its own setter
。但我确实想将 设置newProduct
为product
实例变量。这样做的正确方法是什么?
解决方案
在您的示例中,您将始终返回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)
有关计算属性的更多信息:当你的类中已经有依赖项时使用它们,并且为了方便起见,你想提取一些数据点。如果你依赖某个参数,而不是依赖,你最好做函数,带参数!
推荐阅读
- ios - 表视图中的重复行
- c++ - 如果 Struct 包含互斥体,则 C++ 将初始化器列表推送到标准向量上的问题
- rss - 如何为 Bot Builder 阅读 RSS
- gremlin - Tinkerpop gremlin 忽略顶点
- javascript - 无法理解异步函数中的多个等待
- process - 旧 linux 内核中的子运行优先语义
- reactjs - 是否可以使用 AppSync VTL 使用 BatchPutItem (BatchWriteItem) 在 DynamoDB 上插入超过 25 个项目?
- mysql - 我们可以使用 OR 关键字进行 sql 连接吗?
- mapbox - 如何在一个缩放级别后显示较小的道路?
- c# - 使用 Winapp 驱动程序拖放 UI 元素