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

Posted

技术标签:

【中文标题】如何在 Swift 的绑定中解开可选值?【英文标题】:How can I unwrap an optional value inside a binding in 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 【参考方案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;?

【讨论】:

以上是关于如何在 Swift 的绑定中解开可选值?的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:在展开可选值时意外发现 nil。迅速

可选值是啥意思?

Swift 错误致命错误:在展开可选值时意外发现 nil

对 swift 中的可选值感到困惑

发现可选值错误 nil swift 3

Swift 中的可选值是啥?