【问题标题】:How can I unwrap an optional value inside a binding in Swift?如何在 Swift 的绑定中解开可选值?
【发布时间】:2020-02-06 09:06:45
【问题描述】:

我正在使用 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&lt;UserData?&gt; 类型,而AvatarView 接受Binding&lt;UserData&gt;

我尝试过的事情...

  • $userById[activeUserId]! 不起作用,因为它试图解开 Binding&lt;UserData?&gt;。您只能打开 Optional,而不是 Binding&lt;Optional&gt;

  • $(userById[activeUserId]!) 不起作用的原因我还不明白,但我认为有关 $ 的某些问题在编译时已解决,因此您似乎无法在任意表达式前面加上 $ .

【问题讨论】:

  • 你试过$userById[activeUserId] as! Binding&lt;UserData&gt;吗?
  • 感谢您的建议!我认为它可能会正常工作,但我不想做不安全的演员表。当我尝试它时,我收到一条构建警告,说“从 Binding 转换为不相关的类型 Binding

标签: ios swift swiftui combine


【解决方案1】:

您可以使用this initialiser,它似乎可以处理这种确切的情况 - 将Binding&lt;T?&gt; 转换为Binding&lt;T&gt;?

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

我使用! 强制解包,就像您的尝试一样,但您可以根据需要解包nil。表达式Binding($userById[activeUserId]) 的类型为Binding&lt;UserData&gt;?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多