Generi c тип возврата с ошибкой возврата Codable Generi c параметр 'T' не может быть выведен, даже если Xcode правильно показывает тип возврата на выходе - PullRequest
0 голосов
/ 04 апреля 2020

Я рассмотрел множество связанных вопросов здесь, но ни один из ответов, похоже, не работает для меня прямо сейчас.

Для начала, у меня есть следующая функция, настроенная с помощью c тип возвращаемого значения, который должен соответствовать Decodable.

func readFile<T: Decodable>(url: URL) -> T? {
    do {
        let data = try Data(contentsOf: url)
        return try PropertyListDecoder().decode(T.self,
                                                from: data) as T
    } catch {
        return nil
    }
}

Я пробовал различные вызовы против него, но до сих пор Xcode продолжает возвращать код ошибки

Cannot explicitly specialize a generic function

После некоторых экспериментов Я пришел к следующему:

if let file: CodableStruct = readFile(url: url) as? CodableStruct {
    // File is reported as the correct type here
    // but I still get "Generic parameter 'T' could not be inferred"
}

Моя цель - хранить различные объекты, которые соответствуют Codable, и затем иметь возможность извлекать их с помощью вышеуказанной функции.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2020

Просто удалите условное понижение as? CodableStruct

if let file: CodableStruct = readFile(url: url) {

и - не связанное с ошибкой - удалите также избыточное приведение моста as T.


Рассмотрите возможность сделать функция throw

func readFile<T: Decodable>(url: URL) throws -> T {
    let data = try Data(contentsOf: url)
    return try PropertyListDecoder().decode(T.self, from: data)
}
1 голос
/ 04 апреля 2020

Пересылать ошибки вместе. Не скрывайте их необязательно.

func readFile<Decodable: Swift.Decodable>(url: URL) throws -> Decodable {
  try PropertyListDecoder().decode(
    Decodable.self,
    from: Data(contentsOf: url)
  )
}
let file: CodableStruct = try readFile(url: url)
0 голосов
/ 04 апреля 2020

Оказывается, компилятор был сбит с толку командой try в моей функции readFile.

Мне пришлось добавить ( ), чтобы помочь ему понять утверждение.

return (try PropertyListDecoder().decode(T.self,
                                         from: data)) as T

Тем не менее, vadian был прав в том, что я мог удалить опущенного вниз из вызова.

К комментариям о броске я обращаюсь с ошибкой, но я сократил код, чтобы сделать вопрос короче. Спасибо, что обратились к этому, хотя!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...