假设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'
还有一个修正:
Insert 'as! Decodable'
应用FixIt会导致运行时错误:
Could not cast value of type 'Swift.Array<Swift.Decodable>' (0x11f84dd08) to 'Swift.Decodable' (0x11f84db18).
我在macOS 10.14上使用Xcode 10。
我在这里做错什么了?
编辑:我刚刚试过Xcode 9.2,同样的例子也很好。所以问题就来了,为什么这不再适用于Xcode 10,我应该怎么做呢?我在任何地方都找不到这一变化的参考资料。
最佳答案
根据Swift 4.2中生效的条件一致性法律:
符合可解码的某种类型(类、结构或枚举)的数组是可解码的。
协议可解码的数组不是,因为a protocol does not conform to itself。
(Swift 4.2之前发生的情况是,条件一致性不存在,我们只是得到了一种通用的通行证;你可以把任何一个数组当作可解码的,如果你错了,直到运行时你才会碰到问题。现在,有了条件一致性,编译器实际上会查看元素类型。)
关于arrays - 无法将Array <Codable>强制转换为Codable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52919391/