Swift Property Wrappers-Initialization fails with 'cannot convert value of type 'Double' to expected argument type'

问题描述 投票:0回答:1

我已经让自己成为一个熟悉 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

...然后它工作正常。

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

第一个例子一般出了什么问题?

swift design-patterns
1个回答
1
投票

如果你想让第一个例子工作,你需要一个带值的初始化,否则编译器将不知道如何将值 139.0 分配给

Price
属性

init(wrappedValue: Double) {
    self.price = wrappedValue
}

注意,参数标签是

wrappedValue
,以匹配所需的同名属性,以便可以分配默认值。

并且你还需要删除现有的不带参数的init。这个 init 也是你的第二个例子工作的原因,因为它在

price
构造函数中的
Article
参数没有值时被调用,这意味着它像默认值一样工作。

© www.soinside.com 2019 - 2024. All rights reserved.