Estou criando um aplicativo usando o SwiftUI e gostaria de converter um Binding<Value?>
para um Binding<Value
>.
No meu aplicativo, eu tenho um AvatarView
que sabe como renderizar uma imagem para um usuário específico.
struct AvatarView: View {
@Binding var userData: UserData
...
}
Meu aplicativo possui um ContentView
que possui duas ligações: um dicionário de usuários por ID e o ID do usuário cujo avatar devemos mostrar.
struct ContentView: View {
@State var userById: Dictionary<Int, UserData>
@State var activeUserId: Int
var body: some View {
AvatarView(userData: $userById[activeUserId])
}
}
Problema: o código acima não combina porque $userById[activeUserId]
é do tipo Binding<UserData?>
e AvatarView
leva a Binding<UserData>
.
Coisas que eu tentei ...
$userById[activeUserId]!
não funciona porque está tentando desembrulhar aBinding<UserData?>
. Você só pode desembrulhar umOptional
, não umBinding<Optional>
.$(userById[activeUserId]!)
não funciona por razões que ainda não entendi, mas acho que algo$
foi resolvido no momento da compilação, para que você não consiga prefixar expressões arbitrárias com$
.
$userById[activeUserId] as! Binding<UserData>
?Respostas:
Você pode usar esse inicializador , que parece lidar com esse caso exato - convertendo
Binding<T?>
paraBinding<T>?
:Eu costumava
!
forçar o desembrulhar, assim como em suas tentativas, mas você pode desembrulhar da maneiranil
que quiser. A expressãoBinding($userById[activeUserId])
é do tipoBinding<UserData>?
.fonte