Невозможно привести массив <Codable>к кодируемому - PullRequest
0 голосов
/ 21 октября 2018

Учитывая, что Array соответствует Codable Я предполагаю, что массив Codable, то есть [Codable] должен быть определенно приведен к Codable.Я сделал простой пример только с частью Decodable.И просто для проверки:

// Attempt to conform Array to Decodable
extension Array : Decodable { }

Это вызывает предупреждение: Conformance of 'Array<Element>' to protocol 'Decodable' conflicts with that stated in the type's module 'Swift' and will be ignored; there cannot be more than one conformance, even with different conditional bounds

Это имеет смысл, поскольку Array уже соответствует Decodable.

// Totally decodable array
var array: [Decodable] = ["Decodable", "strings"]

// Attempt to cast the decodable array
var decodable: Decodable = array

Это вызывает ошибку компилятора: Value of type [Decodable] does not conform to specified type 'Decodable'

И FixIt: Insert 'as! Decodable'

Применение FixIt вызывает ошибку времени выполнения: Could not cast value of type 'Swift.Array<Swift.Decodable>' (0x11f84dd08) to 'Swift.Decodable' (0x11f84db18).

Я использую Xcode 10 на macOS10.14.

Так что же я здесь не так делаю?

РЕДАКТИРОВАТЬ: Я только что попробовал с Xcode 9.2, и тот же пример работает нормально.Поэтому возникает вопрос, почему это больше не работает на Xcode 10 и что я должен делать вместо этого?Я нигде не могу найти ссылку на это изменение.

1 Ответ

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

В соответствии с законами условного соответствия, которые вступили в силу в Swift 4.2:

  • Массив некоторого типа (класс, структура или перечисление), которому соответствует *От 1006 * до Декодируемого можно декодировать.

  • Массив протокола Декодируемый - нет, поскольку протокол не соответствует самому себе .

(То, что происходило до Swift 4.2, заключалось в том, что условного соответствия не существовало, и мы просто получали некий универсальный проход; вы могли рассматривать любой массив как декодируемыйи вы не столкнетесь с проблемой до времени выполнения, если ошибаетесь. Теперь, с условным соответствием, компилятор фактически смотрит на тип элемента.)

...