a.h*_*ess 5 design-patterns swift
我为自己设置了一个游乐场示例,以熟悉 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")
Run Code Online (Sandbox Code Playgroud)
如果我使用...
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
Run Code Online (Sandbox Code Playgroud)
...然后就可以正常工作了。
我在构造函数初始化方面做错了什么?初始化包装器属性的正确方法是什么?
一般而言,第一个示例出了什么问题?
如果您希望第一个示例正常工作,则需要一个接受值的 init,否则编译器将不知道如何将值 139.0 分配给Price属性
init(wrappedValue: Double) {
self.price = wrappedValue
}
Run Code Online (Sandbox Code Playgroud)
请注意,参数标签是wrappedValue为了匹配所需的同名属性,以便可以分配默认值。
并且还需要删除现有的不带参数的init。price这个 init 也是您的第二个示例起作用的原因,因为当构造函数中的参数没有值时它会被调用,Article这意味着它像默认值一样工作。
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |