使用 Swift 4 的嵌套编码协议



我正在使用 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

可解码和可编码都是确保这些值可编码和可解码的协议。

所以可编码是一个抽象,它不能解码或编码它的变量 自类型 但可以编码和解码已确认的类型。

最新更新