Разница между self.myString = string и self._myString = State(начальное значение: строка)?

#swiftui #state

#swiftui #состояние

Вопрос:

Учитывая этот контекст:

 struct MyView: View {
    @State private var myString: String
}
  

Сначала я попытался инициализировать его таким образом:

 init(_ string: String) {
    self.myString = string
}
  

Но я получил эту ошибку:

Переменная ‘self.myString’, используемая перед инициализацией

Затем я сделал это:

 init(_ string: String) {
    self._myString = State(initialValue: string)
}
  

Это работает нормально, но поскольку декларативное программирование и состояние для меня в новинку, я не совсем понимаю разницу и что здесь происходит.

Комментарии:

1. State является оболочкой свойства. О оболочках свойств swift читайте docs.swift.org/swift-book/LanguageGuide/Properties.html#ID617

Ответ №1:

Использование @State var name: String — это оболочка свойства, которая представляет собой приятную оболочку вокруг переменной, вызываемой _name типа State<String> . По сути, это:

 struct MyView: View {
    @State private var myString: String
}
  

переводится следующим образом:

 struct MyView: View {
    private var _myString: State<String>
    private var $myString: Binding<String> {
        _myString.projectedValue
    }
    private var myString: String {
        get { _myString.wrappedValue }
        set { _myString.wrappedValue = $0 }
    }
}
  

что должно объяснить вашу проблему (инициализируется использование myString before _myString ).