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 $.


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>?.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.