创建属性包装器时出错

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

我一直在尝试了解 Swift 的属性包装器。文档的代码定义如下,工作正常:

@propertyWrapper
struct TwelveOrLess {
    private var number = 0
    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}
struct SmallRectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}


var rectangle = SmallRectangle()
print(rectangle.height)
// Prints "0"


rectangle.height = 10
print(rectangle.height)
// Prints "10"


rectangle.height = 24
print(rectangle.height)
// Prints "12"

我尝试实现一个将字符串大写的属性包装器:

@propertyWrapper
struct Capitalize{
    private var str1 = String()
    var wrappedValue: String{
        get {return self.str1}
        set {self.str1 = str1.uppercased()}
    }

    init(wrappedValue: String){
        self.str1 = wrappedValue
    }

}

struct test{
    @Capitalize var testStr: String
}


var test1 = test(testStr: "dwa")
print(test1.testStr)

但这会产生以下错误“无法将类型‘String’的值转换为预期的参数类型‘Capitalize’”

我发现在我的 Capitalize 结构中包含一个初始化程序似乎可以消除错误:

init(wrappedValue: String){
        self.str1 = wrappedValue
    }

但现在它没有大写任何东西。我将不胜感激对我的代码的任何输入或更正。非常感谢,

swift property-wrapper
1个回答
0
投票

这是因为

self.str1 = wrappedValue
中的
init
没有调用
self.wrappedValue
的 setter,所以没有大写。将此与
SmallRectangle
的情况进行比较,您在其中写
rectangle.height = 24
。该行调用
wrappedValue
的 setter。

一个简单的修复方法是在

self.wrappedValue
中设置
init
,以便调用它的 setter。

init(wrappedValue: String){
    self.wrappedValue = wrappedValue
}

您不需要在初始化程序中设置

str1
,因为它已经有一个初始值。

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