我一直在尝试了解 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
}
但现在它没有大写任何东西。我将不胜感激对我的代码的任何输入或更正。非常感谢,
这是因为
self.str1 = wrappedValue
中的 init
没有调用 self.wrappedValue
的 setter,所以没有大写。将此与 SmallRectangle
的情况进行比较,您在其中写 rectangle.height = 24
。该行调用 wrappedValue
的 setter。
一个简单的修复方法是在
self.wrappedValue
中设置 init
,以便调用它的 setter。
init(wrappedValue: String){
self.wrappedValue = wrappedValue
}
您不需要在初始化程序中设置
str1
,因为它已经有一个初始值。