Как объявить метод generi c с параметром Array <Codable>? - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь написать короткий и расширяемый метод для запроса данных с сервера.

Этот код не скомпилирован:

func getData<DataType>(url: String, completion : @escaping ((DataType) -> ())) where DataType: Array<Codable>? {
    //
}

Ошибка: Type 'DataType' constrained to non-protocol, non-class type 'Array<Codable>?' (aka 'Array<Decodable & Encodable>')

Плохой обходной путь, который я смог найти:

func getData<RecordType>(url: String, completion : @escaping ((Array<RecordType>?, RecordType) -> ())) where RecordType: Codable {
    //
}

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Рекомендую не ограничиваться массивом. Тип generi c может быть и отдельным объектом или массивом. Однако ограничьте протокол только до Decodable

func getData<DataType>(url: String, completion : @escaping (DataType) -> Void) where DataType: Decodable {
    //
}

И вы также можете вернуть возможную ошибку с типом c Result

func getData<DataType>(url: String, completion : @escaping (Result<DataType,Error>) -> Void) where DataType: Decodable {
    //
}

() и Void являются синонимами, но в обработчиках завершения, которые в любом случае требуют много скобок, легче читать.

0 голосов
/ 04 февраля 2020
func getData<RecordType: Codable>(url: String, completion : @escaping (([RecordType]?, RecordType) -> ())) { // }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...