Comment puis-je déballer une valeur facultative dans une liaison dans Swift?

9

Je crée une application à l'aide de SwiftUI et je voudrais un moyen de convertir un Binding<Value?>enBinding<Value >.

Dans mon application, j'ai un AvatarViewqui sait rendre une image pour un utilisateur particulier.

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

Mon application contient un ContentViewqui possède deux liaisons: un dictionnaire d'utilisateurs par identifiant et l'identifiant de l'utilisateur dont nous devrions 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 il $userById[activeUserId]est de type Binding<UserData?>et AvatarViewprend en a Binding<UserData>.

Ce que j'ai essayé ...

  • $userById[activeUserId]!ne fonctionne pas car il essaie de déballer un fichier 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 $est résolu au moment de la compilation, vous ne pouvez donc pas sembler préfixer des expressions arbitraires avec $.

rjkaplan
la source
As-tu essayé $userById[activeUserId] as! Binding<UserData>?
Kamran
Merci pour la suggestion! Je pense que cela fonctionnerait probablement bien, mais je préférerais ne pas faire un casting dangereux. Quand je l'essaye, j'obtiens un avertissement de construction disant "Cast de Binding <UserData?>
Vers un

Réponses:

10

Vous pouvez utiliser cet initialiseur , qui semble gérer ce cas précis - la conversion Binding<T?>en Binding<T>?:

var body: some View {
    AvatarView(userData: Binding($userById[activeUserId])!)
}

J'ai l'habitude !de forcer le déballage, comme dans vos tentatives, mais vous pouvez déballer comme nilvous le souhaitez. L'expression Binding($userById[activeUserId])est de type Binding<UserData>?.

Balayeuse
la source