gpt4 book ai didi

swift - Codable 和 CodingKeys

转载 作者:行者123 更新时间:2023-11-28 11:34:56 24 4
gpt4 key购买 nike

我正在尝试实现一个协议(protocol),其功能与 Codable 使用 CodingKeys 枚举的方式类似。

使用 CodableCodingKeys,如果您没有在 CodingKeys 枚举中为 Codable 上的每个属性实现一个 case 对象,它会导致编译器错误,指出该对象不符合协议(protocol)。

我查看了文档,唯一能找到与Codable(EncodableDecodable)协议(protocol)相关的要求实现 func encode(to encoder: Encoder)init(from decoder: Decoder) 函数。

我最接近的是定义一个协议(protocol)如下:

protocol TestProtocol {
associatedType Keys: CodingKey
}

这要求实现者有一个符合 CodingKeyKeys 属性,但它并不强制要求所有属性都有一个 case。此外,您不能像使用 Codable 那样将 Keys 属性声明为私有(private)。

CodableCodingKeys 是否在比通过 API 公开的内容更深的层次上处理?

如果没有,是否有办法在 Codable 之外实现 CodingKeys 功能?

最佳答案

你问了两个问题。我认为以相反的顺序解释它们会更容易。

Are Codable and CodingKeys are handled at a deeper level than what is exposed through the APIs?

是的,Swift 编译器知道 EncodableDecodableCodingKey 协议(protocol),并为它们提供特殊代码。

编译器可以合成一个CodingKey兼容的enum,命名为CodingKeysinit(from:)初始化器, 和 encode(to:) 方法,如果满足某些条件。 SE-0166 中详细说明了条件:

Encodable & Decodable requirements can be automatically synthesized for certain types as well:

  1. Types conforming to Encodable whose properties are all Encodable get an automatically generated String-backed CodingKey enum mapping properties to case names. Similarly for Decodable types whose properties are all Decodable
  2. Types falling into (1) — and types which manually provide a CodingKey enum (named CodingKeys, directly, or via a typealias) whose cases map 1-to-1 to Encodable/Decodable properties by name — get automatic synthesis of init(from:) and encode(to:) as appropriate, using those properties and keys
  3. Types which fall into neither (1) nor (2) will have to provide a custom key type if needed and provide their own init(from:) and encode(to:), as appropriate

请注意,CodingKey 兼容类型通常不必被命名为CodingKeys,甚至是枚举 除非你依赖于编译器合成的一致性。

此外,请注意,CodingKeys 类型符合 CodingKey,如果您依赖编译器合成 init(from:)encode(to:)

如果您手动实现 init(from:)encode(to:),您可以为您的 CodingKey 使用任何名称-兼容类型,它只需要有你关心的案例。如果您仅使用单值容器或无键容器进行存储,您甚至不需要符合 CodingKey 的类型。

If not, is there a way to implement the CodingKeys functionality outside of Codable?

如果您所说的“功能”是指编译器自动合成实现的方式,那么唯一的方法是使用代码生成器(如 Sourcery 或 gyb)生成源代码并将其提供给编译器。

如果“功能”是指编译器要求封闭类型的每个 Encodable/Decodable 成员有一个关键成员,那么唯一的方法是通过运行一个单独的程序来分析您的源代码并在缺少任何情况下出错。你不能让标准的 Swift 编译器为你做这件事。

关于swift - Codable 和 CodingKeys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55699588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com