Когда вы работаете с оболочками свойств, у вас есть доступ как к $varName
, так и к _varName
, и я не вижу разницы.Например, здесь
import SwiftUI
struct ContentView: View {
@Binding var varName: String
var body: some View {
TextField("", text: $varName) //here you can also use `_varName`
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(varName: .constant("Hello world!"))
}
}
#endif
вы можете использовать как $varName
, так и _varName
.Два решения кажутся эквивалентными.Обе переменные Binding<String>
.Но если мне нужно что-то вроде этого:
import SwiftUI
struct ContentView: View {
@Binding var varName: String
init(varName: Binding<String>) {
self.$varName = varName //ERROR
}
var body: some View {
TextField("", text: $varName)
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(varName: .constant("Hello world!"))
}
}
#endif
Я получу ошибку:
Невозможно присвоить свойству: $ varName является неизменным
и я должен использовать _varName
, чтобы подавить ошибку:
struct ContentView: View {
@Binding var varName: String
init(varName: Binding<String>) {
self._varName = varName //this works fine
}
var body: some View {
TextField("", text: _varName)
}
}
Они по-прежнему оба Binding<String>
, так почему же первое решение не будет работать?Согласно Apple (https://developer.apple.com/videos/play/wwdc2019/415/) компилятор превратит оболочку свойств в две вещи. Это:
@Binding var varName: String
становится:
//Compiler-synthesized code
var $varName = Binding<String> = Binding<String>()
public var varName: String {
get { $varName.wrappedValue }
set { $varName.wrappedValue = newValue }
}
$varName
должно быть var
, так почему ошибка выше? И, прежде всего, что это _varName
? Откуда она взялась?