Georg
Georg

Reputation: 291

save escaping method reference in swift

I am a Java/Kotlin programmer and new to swift. I want to pass a method reference in a constructor to save it for later use. The method I want to pass looks like this:

func refresh(completion: @escaping (Error?) -> ()) {
    ...
}

What I want to do is instantiate an object and pass this method as a parameter like this:

    refreshControl = Refresher() {
        compl -> Void in
        self.refresh(completion: compl)
    }

The class I want to pass this function to looks like this:

class Refresher  {

   let refresh:  (@escaping (Error?) -> ()) -> Void

   init(refresh: (@escaping (Error?) -> ()) -> Void) {
       self.refresh = refresh
   }

   // call refresh somewhere later
}

This does not compile with error "Assigning non-escaping parameter 'refresh' to an @escaping closure. Not entirely sure what escaping does but I know I need it in the actual refresh function. I am not sure how to syntax this right. Any help would be appreciated.

Upvotes: 0

Views: 199

Answers (1)

matt
matt

Reputation: 535169

But Xcode tells you what to do. It offers you a Fix-It:

init(refresh: @escaping (@escaping (Error?) -> ()) -> Void) {

Personally I would then get rid of the other @escaping stuff you've put in, as it is not needed. So:

class Refresher  {

    let refresh:  ((Error?) -> ()) -> Void

    init(refresh: @escaping ((Error?) -> ()) -> Void) {
        self.refresh = refresh
    }

}

And elsewhere:

func refresh(completion: (Error?) -> ()) {
   // ...
}
func f() {
    let refreshControl = Refresher() {
        compl -> Void in
        self.refresh(completion: compl)
    }
    // ...
}

Upvotes: 1

Related Questions