Ich erstelle eine App mit SwiftUI und möchte eine Möglichkeit, eine Binding<Value?>
in eine Binding<Value
> zu konvertieren .
In meiner App habe ich eine, AvatarView
die weiß, wie man ein Bild für einen bestimmten Benutzer rendert.
struct AvatarView: View {
@Binding var userData: UserData
...
}
Meine App enthält eine ContentView
, die zwei Bindungen besitzt: ein Wörterbuch der Benutzer nach ID und die ID des Benutzers, dessen Avatar angezeigt werden soll.
struct ContentView: View {
@State var userById: Dictionary<Int, UserData>
@State var activeUserId: Int
var body: some View {
AvatarView(userData: $userById[activeUserId])
}
}
Problem: Der obige Code wird nicht kombiniert, da er $userById[activeUserId]
vom Typ ist Binding<UserData?>
und AvatarView
a enthält Binding<UserData>
.
Dinge, die ich versucht habe ...
$userById[activeUserId]!
funktioniert nicht, weil es versucht, a auszupackenBinding<UserData?>
. Sie können nur eine auspackenOptional
, keineBinding<Optional>
.$(userById[activeUserId]!)
funktioniert aus Gründen, die ich noch nicht verstehe, nicht, aber ich denke, dass etwas$
zur Kompilierungszeit gelöst wird, sodass Sie scheinbar keinen beliebigen Ausdrücken voranstellen können$
.
$userById[activeUserId] as! Binding<UserData>
?Antworten:
Sie können diesen Initialisierer verwenden , der genau diesen Fall zu behandeln scheint - Konvertierung
Binding<T?>
inBinding<T>?
:Ich habe das
!
Auspacken erzwungen, genau wie bei Ihren Versuchen, aber Sie können das auspacken, wienil
Sie möchten. Der AusdruckBinding($userById[activeUserId])
ist vom TypBinding<UserData>?
.quelle