7

我在玩 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但我就是无法让它工作。

我的问题:这是一个编译器错误(它仍然是测试版)还是我做错了什么?

4

1 回答 1

4

如果你切换协议

CodableSomething

对于一个结构,你不会有错误,

进一步阅读并阅读有关 Codable 的更多信息

Codable可以处理哪些类型,为什么?在那里你基本上是在对 xCode 说这个

struct foo: Codable {
    var ok: Codable
}

Codable深入了解它是不对的, Typealias 您需要遵守使用它的子类,例如.Decode().Encode() 这些方法与值而不是抽象类型一起使用,因此将Codable类型赋予一个变量是行不通的。因为Codabletypealias表示 Decodable&Encodable

/// A type that can convert itself into and out of an external representation.
public typealias Codable = Decodable & Encodable

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

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

于 2018-09-16T13:50:22.467 回答