Cannot convert value of type 'Published<Bool>.Publisher' to expected argument type 'Binding<Bool>' Cannot convert value of type 'Published<Bool>.Publisher' to expected argument type 'Binding<Bool>' ios ios

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.