如何在Swift的绑定中解开可选值?

时间:2019-10-09 04:42:15

标签: ios swift swiftui combine

我正在使用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>

我尝试过的事情...

  • $userById[activeUserId]!不起作用,因为它试图解开Binding<UserData?>。您只能解开Optional,而不能解开Binding<Optional>

  • $(userById[activeUserId]!)由于我尚不了解的原因而无法使用,但我认为$的某些问题在编译时已解决,因此您似乎无法在任意表达式前添加前缀$

1 个答案:

答案 0 :(得分:8)

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

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

我已经使用!来强制展开,就像您尝试进行的一样,但是您可以随意展开nil。表达式Binding($userById[activeUserId])的类型为Binding<UserData>?