web-dev-qa-db-ja.com

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

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

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

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

私のアプリは、2つのバインディングを所有する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?>型であり、AvatarViewBinding<UserData>を取り込むため、上記のコードは結合されません。

私が試したもの...

  • $userById[activeUserId]!は、Binding<UserData?>をアンラップしようとしているため機能しません。アンラップできるのはOptionalだけで、Binding<Optional>はできません。

  • $(userById[activeUserId]!)は、まだ理解していない理由で機能しませんが、$の一部はコンパイル時に解決されるため、任意の式の前に$を付けることができないようです。

9
rjkaplan

this initialiser を使用できます。これは、この正確なケースを処理するようです-_Binding<T?>_を_Binding<T>?_に変換します。

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

私は_!_を使用して、ラップを強制的に解除しましたが、nilは必要に応じてラップ解除できます。式Binding($userById[activeUserId])は_Binding<UserData>?_型です。

9
Sweeper