无法将数组<Codable>转换为可编码



鉴于Array符合Codable,我假设一个Codable数组,即[Codable]绝对应该可转换为Codable

我只用Decodable部分做了一个简单的例子。只是为了验证:

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

这会导致警告:

"Array"对协议"Decodable"的一致性与类型模块"Swift"中声明的一致性冲突,将被忽略;即使具有不同的条件边界,也不能有多个一致性

这是有道理的,因为Array已经符合Decodable

// Totally decodable array
var array: [Decodable] = ["Decodable", "strings"]
// Attempt to cast the decodable array
var decodable: Decodable = array

这会导致编译器错误:

[可解码

]类型的值不符合指定的类型"可解码">

还有一个修复:Insert 'as! Decodable'

应用 FixIt 会导致运行时错误:

无法将类型"Swift.Array"(0x11f84dd08(的值转换为"Swift.Decodable"(0x11f84db18(。

我在 macOS 10.14 上使用 Xcode 10。

那么我在这里做错了什么?

我刚刚尝试使用Xcode 9.2,相同的示例工作正常。所以问题变成了为什么这在 Xcode 10 上不再有效,我应该做什么?我在任何地方都找不到对此更改的任何引用。

根据 Swift 4.2 中生效的条件一致性法则:

  • 符合可解码的某种类型(类、结构或枚举(的数组是可解码的。

  • 协议的数组 Decodable 不是,因为协议不符合自身。

(在 Swift 4.2 之前发生的事情是,条件一致性不存在,我们只是得到了一种通用传递;你可以将任何数组视为可解码的,如果你错了,你不会在运行时遇到问题。现在,通过条件一致性,编译器实际上查看元素类型。

相关内容

  • 没有找到相关文章

最新更新