考虑这个@propertyWrapper:
@propertyWrapper struct Capitalized {
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.capitalized }
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.capitalized
}
}
这样使用:
struct User {
@Capitalized var userName: String
}
我的问题是:
为什么我需要使用属性
userName
来指定类型注释。难道编译器不够聪明,推断出由于 wrappedValue
类型的 @Capitalized
是 String
,所以属性 userName
只能是 String
类型。
如果我省略类型注释,则会收到编译器错误:
模式中缺少类型注释
此处的诊断效果很差,无法指出实际问题。问题是,没有赋值的
@Capitalized
会转换为 Capitalized()
,并且没有这样的初始化器。您可以通过提供默认初始化程序来解决此问题:
@propertyWrapper struct Capitalized {
...
init() { self.init(wrappedValue: "") }
}
有了这个,你的结构就很好了:
struct User {
@Capitalized var userName
}
如果没有默认的
init()
,下面的也可以,因为它调用 Capitalized(wrappedValue:)
:
struct User {
@Capitalized var userName = "bob"
}