如何在 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<UserData?>
类型,而AvatarView
接受Binding<UserData>
。
我尝试过的事情...
$userById[activeUserId]!
不起作用,因为它试图解开 Binding<UserData?>
。您只能打开 Optional
,而不是 Binding<Optional>
。
$(userById[activeUserId]!)
不起作用的原因我还不明白,但我认为有关 $
的某些问题在编译时已解决,因此您似乎无法在任意表达式前面加上 $
.
【问题讨论】:
你试过$userById[activeUserId] as! Binding<UserData>
吗?
感谢您的建议!我认为它可能会正常工作,但我不想做不安全的演员表。当我尝试它时,我收到一条构建警告,说“从 Binding您可以使用this initialiser,它似乎可以处理这种确切的情况 - 将Binding<T?>
转换为Binding<T>?
:
var body: some View
AvatarView(userData: Binding($userById[activeUserId])!)
我使用!
强制解包,就像您的尝试一样,但您可以根据需要解包nil
。表达式Binding($userById[activeUserId])
的类型为Binding<UserData>?
。
【讨论】:
以上是关于如何在 Swift 的绑定中解开可选值?的主要内容,如果未能解决你的问题,请参考以下文章