Учитывая, что 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 на macOS 10.14.
Так что я делаю неправильно здесь?
РЕДАКТИРОВАТЬ: я только что попробовал Xcode 9.2, и тот же пример работает нормально. Итак, возникает вопрос, почему это больше не работает в Xcode 10 и что я должен делать вместо этого? Нигде не могу найти ссылку на это изменение.
Decodable
в примере наEncodable
и получить те же ошибки. Дело в том, что код не компилируется. @vadian[Decodable]
означаетArray<Decodable>
, что означаетArray
, гдеElement
равноDecodable
. Расширение было просто для демонстрации того, что Array действительно уже соответствуетDecodable
, требованием которого, как вы указываете, является то, что его универсальныйElement
соответствуетDecodable
. - person user614273   schedule 21.10.2018