сохранить ссылку на метод экранирования в swift - PullRequest
0 голосов
/ 17 марта 2020

Я программист на Java / Kotlin и новичок в swift. Я хочу передать ссылку на метод в конструкторе, чтобы сохранить его для дальнейшего использования. Метод, который я хочу передать, выглядит следующим образом:

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

Я хочу создать экземпляр объекта и передать этот метод в качестве параметра следующим образом:

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

Класс I хочу передать эту функцию следующим образом:

class Refresher  {

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

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

   // call refresh somewhere later
}

Это не компилируется с ошибкой «Присваивание неэкранирующего параметра refre sh закрытию @escaping. Не совсем уверен, что делает экранирование, но Я знаю, что мне нужно это в действующей функции refre * 1013. * Я не уверен, как синтаксис этого права. Любая помощь будет оценена.

1 Ответ

1 голос
/ 17 марта 2020

Но Xcode говорит , что вам делать. Он предлагает вам исправить это:

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

Лично я бы избавился от других @escaping вещей, которые вы вставили, так как они не нужны. Итак:

class Refresher  {

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

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

}

И в других местах:

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