средство настройки getter с оболочками свойств

#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. Блок получения вызывает свойство, которое, в свою очередь, вызывает средство получения свойств, это вызывает бесконечный цикл.