我已经让自己成为一个熟悉 Property Wrappers 的游乐场示例。
以下代码:
import Foundation
@propertyWrapper
struct Price {
private var price: Double
init() {
self.price = 0.0
}
var wrappedValue: Double {
get {
return self.price
}
set {
if newValue < 0.0 {
self.price = 0.0
} else if newValue > 10_000 {
return
} else {
self.price = newValue
}
}
}
}
struct Article {
var vendor: String
var name: String
@Price var price: Double
}
var display = Article(vendor: "Asus", name: "X127", price: 139.0)
/*
expression failed to parse:
error: Playground.playground:33:60: error: cannot convert value of type 'Double' to expected argument type 'Price'
var display = Article(vendor: "Asus", name: "X127", price: 139.0)
*/
print("\(display.vendor) Display costs \(display.price) Euro")
如果我用...
var display = Article(vendor: "Asus", name: "X127")
display.price = 129.99
print("\(display.vendor) Display costs \(display.price) Euro")
// Asus Display costs 129.99 Euro
...然后它工作正常。
构造函数初始化我做错了什么?初始化包装器属性的正确方法是什么?
第一个例子一般出了什么问题?
如果你想让第一个例子工作,你需要一个带值的初始化,否则编译器将不知道如何将值 139.0 分配给
Price
属性
init(wrappedValue: Double) {
self.price = wrappedValue
}
注意,参数标签是
wrappedValue
,以匹配所需的同名属性,以便可以分配默认值。
并且你还需要删除现有的不带参数的init。这个 init 也是你的第二个例子工作的原因,因为它在
price
构造函数中的 Article
参数没有值时被调用,这意味着它像默认值一样工作。
• 在 Spring 中定义 java.util.Queue bean 的正确方法?
• Swagger Generate Subtypes based on enum giving an error
• @Transactional Spring MyBatis 不工作
• JSX 文字和组件有什么区别? React.jsx:类型无效——需要一个字符串
• 绑定 2 个不同的纹理单元,但只有一个会在 opengl 中渲染 [重复]
• 如何使用 Jasmine Marbles 测试永无止境的流?
• pytorch 神经网络的 int64 类型和 Long 类型的区别
• 如何使用 unput 标签中的一个提交按钮而不是按钮标签
• 导入Excel数据时出现transformDateTime错误