私は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?>
型であり、AvatarView
はBinding<UserData>
を取り込むため、上記のコードは結合されません。
私が試したもの...
$userById[activeUserId]!
は、Binding<UserData?>
をアンラップしようとしているため機能しません。アンラップできるのはOptional
だけで、Binding<Optional>
はできません。
$(userById[activeUserId]!)
は、まだ理解していない理由で機能しませんが、$
の一部はコンパイル時に解決されるため、任意の式の前に$
を付けることができないようです。
this initialiser を使用できます。これは、この正確なケースを処理するようです-_Binding<T?>
_を_Binding<T>?
_に変換します。
_var body: some View {
AvatarView(userData: Binding($userById[activeUserId])!)
}
_
私は_!
_を使用して、ラップを強制的に解除しましたが、nil
は必要に応じてラップ解除できます。式Binding($userById[activeUserId])
は_Binding<UserData>?
_型です。