Swiftのバインディング内でオプションの値をアンラップするにはどうすればよいですか?


9

私はSwiftUIを使用してアプリを構築していBinding<Value?>て、Binding<Value>を> に変換する方法を望んでいます。

私のアプリには、AvatarView特定のユーザーのために画像をレンダリングする方法を知っているがあります。

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

私のアプリは、ContentView2つのバインディングを所有するを保持しています。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>か?
Kamran、

提案をありがとう!おそらくうまくいくと思いますが、危険なキャストはしないほうがいいと思います。私はそれをしようとすると、私は「<?UserDataのを>バインディングからのバインディング関係のないタイプ<UserDataを>への出演」というビルド警告を取得
rjkaplan

回答:


10

このイニシャライザーを使用できます。これは、この正確なケースを処理するBinding<T?>ようBinding<T>?です-に変換します:

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

私は!あなたの試みのように、アンラップを強制的に使用してきましたが、あなたが望むようにアンラップすることができnilます。式Binding($userById[activeUserId])のタイプはBinding<UserData>?です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.