Tworzę aplikację za pomocą SwiftUI i chciałbym sposób przekonwertować Binding<Value?>
na Binding<Value
>.
W mojej aplikacji mam taki, AvatarView
który wie, jak renderować obraz dla konkretnego użytkownika.
struct AvatarView: View {
@Binding var userData: UserData
...
}
Moja aplikacja zawiera ContentView
dwa powiązania: słownik użytkowników według identyfikatora i identyfikator użytkownika, którego awatar powinniśmy wyświetlać.
struct ContentView: View {
@State var userById: Dictionary<Int, UserData>
@State var activeUserId: Int
var body: some View {
AvatarView(userData: $userById[activeUserId])
}
}
Problem: powyższy kod nie łączy się, ponieważ $userById[activeUserId]
jest typu Binding<UserData?>
i AvatarView
przyjmuje Binding<UserData>
.
Rzeczy, których próbowałem ...
$userById[activeUserId]!
nie działa, ponieważ próbuje rozpakować plikBinding<UserData?>
. Możesz tylko rozpakowaćOptional
, a nieBinding<Optional>
.$(userById[activeUserId]!)
nie działa z powodów, których jeszcze nie rozumiem, ale myślę, że coś$
zostało rozwiązane w czasie kompilacji, więc nie możesz poprzedzać dowolnych wyrażeń$
.
$userById[activeUserId] as! Binding<UserData>
?Odpowiedzi:
Możesz użyć tego inicjalizatora , który wydaje się obsługiwać dokładnie ten przypadek - konwertując
Binding<T?>
naBinding<T>?
:Kiedyś
!
wymuszałem rozpakowywanie, tak jak przy twoich próbach, ale możesz rozpakowywać taknil
, jak chcesz. WyrażenieBinding($userById[activeUserId])
jest typuBinding<UserData>?
.źródło