Cannot convert value of type 'Published<Bool>.Publisher' to expected argument type 'Binding<Bool>'
** Still new to Combine & SwiftUI so not sure if there is better way to approach **
You can initalize Binding from publisher.
https://developer.apple.com/documentation/swiftui/binding/init(get:set:)-6g3d5
let binding = Binding( get: { [weak self] in (self?.showPasswordReset ?? false) }, set: { [weak self] in self?.showPasswordReset = $0 })PasswordResetView(isPresented: binding)
Here is possible approach - the idea to make possible observation in generated view and avoid tight coupling between factory & presenter.
Tested with Xcode 12 / iOS 14 (for older systems some tuning might be needed)
protocol ResetViewModel { var showPasswordReset: Bool { get set }}struct PasswordResetView<Model: ResetViewModel & ObservableObject>: View { @ObservedObject var resetModel: Model var body: some View { if resetModel.showPasswordReset { Text("Show password reset") } else { Text("Show something else") } }}class LoginViewModel: ObservableObject, Identifiable, ResetViewModel { @Published var mailAdress: String = "" @Published var password: String = "" @Published var showRegister = false @Published var showPasswordReset = false private let applicationStore: ApplicationStore init(applicationStore: ApplicationStore) { self.applicationStore = applicationStore } var passwordResetView: some View { PasswordResetView(resetModel: self) }}
I think the important thing to understand here is what "$" does in the Combine context.
What "$" does is to publish the changes of the variable "showPasswordReset" where it is being observed.
when it precedes a type, it doesn't represent the type you declared for the variable (Boolean in this case), it represents a publisher, if you want the value of the type, just remove the "$".
"$" is used in the context where a variable was marked as an @ObservedObject,(the ObservableObject here is LoginViewModel and you subscribe to it to listen for changes in its variables market as publishers)
struct ContentView: View { @ObservedObject var loginViewModel: LoginViewModel...
in that context (the ContentView for example) the changes of "showPasswordReset" are going to be 'Published' when its value is updated so the view is updated with the new value.