我正试图用Property包装器来包装(双关语(我的头脑。虽然它带来的概念和价值对我来说很清楚,但我很困惑为什么我不能在下面的代码中使用getter(setter(:
我的代码:
@propertyWrapper struct Capitalized {
var wrappedValue: String {
get {
return wrappedValue.capitalized
}
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.capitalized
//error: Cannot assign to property: 'wrappedValue' is a get-only property
}
}
实际工作的教程代码:
@propertyWrapper struct Capitalized {
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.capitalized }
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.capitalized
}
}
struct User {
@Capitalized var firstName: String
@Capitalized var lastName: String
}
// John Appleseed
var user = User(firstName: "john", lastName: "appleseed")
// John Smith
user.lastName = "smith"
根据我对计算属性的理解,我正在将包装后的值大写并返回,不确定为什么我会出现突出显示完全相同的错误!
只有当您像在代码中那样将wrappedValue
属性定义为计算属性时,才将其定义为get。此外,当getter尝试获取自己的值时,这会导致一个无限循环。
var wrappedValue: String {
get { wrappedValue.capitalized }
}
修复方法是使用didSet
方法。
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.capitalized }
}