#swift
#swift
Вопрос:
Я пытаюсь обернуть (каламбур) свою голову вокруг оболочек свойств. Хотя концепция и ценность, которые она приносит, мне совершенно понятны, я запутываюсь в том, почему я не могу использовать getter (установщик) в приведенном ниже коде:
Мой код:
@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"
Согласно моему пониманию вычисляемых свойств, я использую заглавную букву обернутого значения и возвращаю его, не уверен, почему я получаю ошибку, которая выделяет то же самое!
Ответ №1:
Вы определяете wrappedValue
свойство как доступное только для получения, когда определяете его как вычисляемое свойство, как вы сделали в коде. Кроме того, это вызывает бесконечный цикл, когда получатель пытается получить собственное значение.
var wrappedValue: String {
get { wrappedValue.capitalized }
}
Исправление заключается в использовании didSet
метода.
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.capitalized }
}
Комментарии:
1. бесконечный цикл, как в? прошу прощения, не совсем понял это?
2. Блок получения вызывает свойство, которое, в свою очередь, вызывает средство получения свойств, это вызывает бесконечный цикл.