我稍微玩了一下Swift 4和Codable,陷入了一些嵌套协议(protocol)都符合Codable的场景。

简化的示例如下所示:

protocol CodableSomething: Codable {}

protocol CodableAnotherThing: Codable {
    var something: CodableSomething { get }
}

struct Model: CodableAnotherThing {
    var something: CodableSomething
}

This code使用Xcode 9 Beta 5产生了构建错误:
  • 类型“模型”不符合协议(protocol)“可解码”
  • 类型“模型”不符合协议(protocol)“可编码”

  • 现在,我没想到会出现这些错误,因为我了解到这些协议(protocol)的一致性将由编译器自动生成,而实际上,我什至无法在没有构建错误的情况下手动实现此一致性。我还尝试了几种不同的方法来使用Codable解决这种嵌套模型结构,但是我无法使其正常工作。

    我的问题:这是编译器错误(仍为beta)还是我做错了什么?

    最佳答案

    如果切换协议(protocol)



    对于一个结构体,您不会有任何错误,

    进一步了解有关的更多信息可编码的

    可编码可以使用的类型是什么?为什么?
    在那里,您基本上是对xCode讲这个

    struct foo: Codable {
        var ok: Codable
    }
    

    那是不对的,请深入了解一下,CodableTypealias您需要遵循才能使用其子项,例如.Decode().Encode()这些方法适用于值而不是抽象类型
    所以给一个Codable类型给一个变量是不可能的。
    因为Codable是一个typealias,它指示DecodableEncodable
    /// A type that can convert itself into and out of an external representation.
    public typealias Codable = Decodable & Encodable
    

    Decodable和Encodable都是确保这些值可编码和可解码的协议(protocol)。

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

    关于swift4 - Swift 4的嵌套可编码协议(protocol),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45723330/

    10-13 07:17