Infer Generic Type In Completion Block - PullRequest
       4

Infer Generic Type In Completion Block

0 голосов
/ 12 октября 2018

У меня есть функция:

static func requestArray<T>(completion: @escaping (_ result: Result<[T], Error>) -> ()) {

}

Это называется следующим образом:

MyClass.requestArray() { result in
    switch result {
        case .success(let array):
            break
        case .failure(let error):
            break
        }
}

Однако это не работает, потому что не может вывести универсальный тип T.Как я могу изменить свой код, чтобы он распознал, какой должен быть тип T?(Предположим, что array должно иметь тип [String])

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Обычно удобнее, если API перемещает тип в сигнатуру, чтобы упростить закрытие:

static func requestArray<T>(of: T.Type, completion: @escaping (_ result: Result<[T], Error>) -> ()) { }

Когда это сделано, вызов становится:

MyClass.requestArray(of: String.self) { result in
    switch result {
        case .success(let array):
            break
        case .failure(let error):
            break
        }
}

Этот подход также хорошо работает, когда T является возвращаемым типом.См. Codeable для хорошего примера такого подхода в таких методах, как decode(_;from:).

0 голосов
/ 12 октября 2018

Вы явно объявили тип result в обработчике завершения при вызове функции:

MyClass.requestArray() { (result: Result<[String], Error>) in
    switch result {
    case .success(let array):
        break
    case .failure(let error):
        break
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...