带有属性包装的getter-setter



我正试图用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 }
}

最新更新