Je crée une application à l'aide de SwiftUI et je voudrais un moyen de convertir un Binding<Value?>
En un Binding<Value
>.
Dans mon application, j'ai un AvatarView
qui sait comment rendre une image pour un utilisateur particulier.
struct AvatarView: View {
@Binding var userData: UserData
...
}
Mon application contient un ContentView
qui possède deux liaisons: un dictionnaire d'utilisateurs par identifiant et l'identifiant de l'utilisateur dont nous devons montrer l'avatar.
struct ContentView: View {
@State var userById: Dictionary<Int, UserData>
@State var activeUserId: Int
var body: some View {
AvatarView(userData: $userById[activeUserId])
}
}
Problème: le code ci-dessus ne se combine pas car $userById[activeUserId]
Est de type Binding<UserData?>
Et AvatarView
prend un Binding<UserData>
.
Ce que j'ai essayé ...
$userById[activeUserId]!
Ne fonctionne pas, car il essaie de déballer un Binding<UserData?>
. Vous pouvez uniquement déballer un Optional
, pas un Binding<Optional>
.
$(userById[activeUserId]!)
ne fonctionne pas pour des raisons que je ne comprends pas encore, mais je pense que quelque chose à propos de $
est résolu au moment de la compilation, vous ne pouvez donc pas sembler préfixer des expressions arbitraires avec $
.
Vous pouvez utiliser cet initialiseur , qui semble gérer ce cas précis - convertir Binding<T?>
En Binding<T>?
:
var body: some View {
AvatarView(userData: Binding($userById[activeUserId])!)
}
J'ai utilisé !
Pour forcer le déballage, comme dans vos tentatives, mais vous pouvez déballer le nil
comme vous le souhaitez. L'expression Binding($userById[activeUserId])
est de type Binding<UserData>?
.