Swift 属性包装器 - 初始化失败,并显示“无法将‘Double’类型的值转换为预期的参数类型”

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)

...然后就可以正常工作了。

我在构造函数初始化方面做错了什么?初始化包装器属性的正确方法是什么?

一般而言,第一个示例出了什么问题?

Joa*_*son 3

如果您希望第一个示例正常工作,则需要一个接受值的 init,否则编译器将不知道如何将值 139.0 分配给Price属性

init(wrappedValue: Double) {
    self.price = wrappedValue
}
Run Code Online (Sandbox Code Playgroud)

请注意,参数标签是wrappedValue为了匹配所需的同名属性,以便可以分配默认值。

并且还需要删除现有的不带参数的init。price这个 init 也是您的第二个示例起作用的原因,因为当构造函数中的参数没有值时它会被调用,Article这意味着它像默认值一样工作。