user19559647
user19559647

Reputation: 559

iOS SwiftUI - Cannot pass function of type '() async -> Void' to parameter expecting synchronous function type

TextField("search", text: $searchText)
    .accentColor(Color("ClickableLink"))
    .foregroundColor(.white)
    .focused($focusedField, equals: .field)
    .onAppear {
        self.focusedField = .field
    }
    .onSubmit {
        loadinglayout = true

        do {
            try await getMemes()
        }
        catch {
            print(error)
        }
    }

I get

"Cannot pass function of type '() async -> Void' to parameter expecting synchronous function type"

inside onSubmit.

So far the

do 

method solved this kind of issues, why not here? I have absolutely no idea what else I could try

Upvotes: 33

Views: 31746

Answers (2)

Sheikh Wahab Mahmood
Sheikh Wahab Mahmood

Reputation: 428

If you are calling async function inside button

Button {
         Task{
               await fetchData()
             }
       } label: {
               Text("Refresh Time")
       }

it will wait for function to return data.

Upvotes: 3

David Pasztor
David Pasztor

Reputation: 54716

The problem is that you are trying to call an async method from a synchronous method. onSubmit is synchronous, while getMemes is async.

You need to wrap async methods in a Task if you want to call them from a synchronous context.

.onSubmit {
    loadinglayout = true
    Task {
        do {
            try await getMemes()
        }
        catch {
            print(error)
        }
    }
}                            

Upvotes: 42

Related Questions