我正在使用 Swift 4 并Codable
了一点,并陷入了一些嵌套协议的场景,这些协议都符合Codable
。
简化的示例如下所示:
protocol CodableSomething: Codable {}
protocol CodableAnotherThing: Codable {
var something: CodableSomething { get }
}
struct Model: CodableAnotherThing {
var something: CodableSomething
}
这段代码在 Xcode 9 Beta 5 中犯了一个构建错误:
- 类型"模型"不符合"可解码"协议
- 类型"模型"不符合协议"可编码">
现在,我没想到会出现这些错误,因为我知道编译器会自动生成对这些协议的一致性,而事实上,如果没有构建错误,我甚至无法手动实现这种一致性。我还尝试了几种不同的方法来使用Codable
来解决这种嵌套模型结构,但我就是无法让它工作。
我的问题:这是一个编译器错误(它仍然是测试版(还是我做错了什么?
如果切换协议
可编码的东西
对于结构,您将没有错误,
更进一步,阅读更多关于Codable
Codable可以处理哪些类型,为什么? 在那里,你基本上是对xCode说的
struct foo: Codable {
var ok: Codable
}
那是不对的,深入看看,Codable
是一个Typealias
您需要遵守才能使用其子,例如.Decode()
、.Encode()
这些方法适用于值而不是抽象类型 所以给一个不会奏效的变量一个Codable
类型。 因为Codable
是一个typealias
指示Decodable
&Encodable
/// A type that can convert itself into and out of an external representation.
public typealias Codable = Decodable & Encodable
可解码和可编码都是确保这些值可编码和可解码的协议。
所以可编码是一个抽象,它不能解码或编码它的变量 自类型 但可以编码和解码已确认的类型。