Учитывая ту же реализацию обратного вызова, абстрактные вызовы функций - PullRequest
0 голосов
/ 25 апреля 2018

Предполагая, что у меня есть 2 функции foo и bar, определенные ниже.

func foo(completion: @escaping (Response) -> Void)
func bar(a: Int, completion: @escaping (Response) -> Void)

Тогда у меня есть 2 разные функции, которые используют foo и bar

func doSomethingWithFoo() {
    foo { response in
        handleResponse(response)
    }
}

func doSomethingWithBar() {
    bar(a: 42) { response in
        handleResponse(response)
    }
}

doSomethingWithFoo и doSomethingWithBar очень похожи. Они делают то же самое с response, который они получают в completion обратном вызове.

Мой вопрос: есть ли способ в Swift обобщить doSomethingWithFoo и doSomethingWithBar? Может быть, что-то в соответствии со следующим.

func doSomething(<???>) {
    <???> { response in
        handleResponse(response)
    }
}

<???> является заполнителем для передачи либо foo или bar, либо даже любой другой функции, которая также принимает обратный вызов типа (Response) -> Void.

Буду признателен за любую помощь / понимание. Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете объявить функцию следующим образом:

func doSomething(fooBar: (_ completion: @escaping (String) -> Void) -> Void) -> Void {
    fooBar(handleResponse)
}

Который вы бы назвали так:

doSomething(fooBar: { bar(a: 42, completion: $0) })
doSomething(fooBar: foo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...