如何在 Swift 中的绑定中解包一个可选值?

How can I unwrap an optional value inside a binding in Swift?

我正在使用 SwiftUI 构建一个应用程序,并且想要一种将 Binding<Value?> 转换为 Binding<Value> 的方法。

在我的应用程序中,我有一个 AvatarView 知道如何为特定用户呈现图像。

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

我的应用程序拥有一个 ContentView,它拥有两个绑定:按 ID 列出的用户字典,以及我们应该显示其头像的用户的 ID。

struct ContentView: View {
  @State var userById: Dictionary<Int, UserData>
  @State var activeUserId: Int

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

问题:上面的代码没有合并,因为 $userById[activeUserId]Binding<UserData?> 类型,而 AvatarView 接受 Binding<UserData>.

我尝试过的东西...

您可以使用 this initialiser,它似乎可以处理这种情况 - 将 Binding<T?> 转换为 Binding<T>?:

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

我已经使用 ! 强制解包,就像您尝试的那样,但是您可以根据需要解包 nil。表达式 Binding($userById[activeUserId]) 的类型为 Binding<UserData>?.