web-dev-qa-db-fra.com

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

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

9
rjkaplan

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

9
Sweeper