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