- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个协议(protocol),其功能与 Codable
使用 CodingKeys
枚举的方式类似。
使用 Codable
和 CodingKeys
,如果您没有在 CodingKeys
枚举中为 Codable 上的每个属性实现一个 case
对象,它会导致编译器错误,指出该对象不符合协议(protocol)。
我查看了文档,唯一能找到与Codable
(Encodable
和Decodable
)协议(protocol)相关的要求实现 func encode(to encoder: Encoder)
和 init(from decoder: Decoder)
函数。
我最接近的是定义一个协议(protocol)如下:
protocol TestProtocol {
associatedType Keys: CodingKey
}
这要求实现者有一个符合 CodingKey
的 Keys
属性,但它并不强制要求所有属性都有一个 case。此外,您不能像使用 Codable
那样将 Keys
属性声明为私有(private)。
Codable
和 CodingKeys
是否在比通过 API 公开的内容更深的层次上处理?
如果没有,是否有办法在 Codable
之外实现 CodingKeys
功能?
最佳答案
你问了两个问题。我认为以相反的顺序解释它们会更容易。
Are Codable and CodingKeys are handled at a deeper level than what is exposed through the APIs?
是的,Swift 编译器知道 Encodable
、Decodable
和 CodingKey
协议(protocol),并为它们提供特殊代码。
编译器可以合成一个CodingKey
兼容的enum
,命名为CodingKeys
,init(from:)
初始化器, 和 encode(to:)
方法,如果满足某些条件。 SE-0166 中详细说明了条件:
Encodable
&Decodable
requirements can be automatically synthesized for certain types as well:
- Types conforming to
Encodable
whose properties are allEncodable
get an automatically generatedString
-backedCodingKey
enum
mapping properties to case names. Similarly forDecodable
types whose properties are allDecodable
- Types falling into (1) — and types which manually provide a
CodingKey
enum
(namedCodingKeys
, directly, or via atypealias
) whose cases map 1-to-1 toEncodable
/Decodable
properties by name — get automatic synthesis ofinit(from:)
andencode(to:)
as appropriate, using those properties and keys- Types which fall into neither (1) nor (2) will have to provide a custom key type if needed and provide their own
init(from:)
andencode(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/
我一直在尝试使用自定义解码来解码 json,但我遇到了一个我无法解决的问题,而且我的想法已经用完了。我故意注释掉了 Order 结构中的 additionalInfo 只是为了让我的生活更轻松。 如有
我有一个符合 CodingKey 的结构 DynamicKey 。然后我决定使用编码 [String: Any] 的函数来扩展 KeyedEncodingContainer 现有的功能.. 现在我到达
是否可以为单个属性使用多个 CodingKey? struct Foo: Decodable { enum CodingKeys: String, CodingKey { ca
我正在研究 GRDB 数据模型。我的问题可能的根源在于测试版:版本 12.0 beta 2 (12A6163b)。 我在几个结构中出现间歇性错误。 Cannot find 'CodingKeys' 出
编译正常没有问题: class User: Codable { let name: String let email: String } 但是,如果我们有一个不是由 CodingKey
我正在尝试实现一个协议(protocol),其功能与 Codable 使用 CodingKeys 枚举的方式类似。 使用 Codable 和 CodingKeys,如果您没有在 CodingKeys
假设我有以下可解码结构作为示例,说明我正在尝试做的事情: struct Object: Decodable { var id: String var name: String } 和这
假设我们有一个 JSON 结构如下: { "July": [ { ... "startDate": "July 10",
考虑以下对象: struct User: Codable { let id: Int let email: String let name: String } 是否可以获得特定
我有我提供的类型 CodingKeys根据需要为其数据成员提供自定义名称。我想根据不同调用站点的要求,仅编码类型 CodingKeys 的一个子集。在将数据发送到服务器之前。所需的编码因调用站点而异,
当我尝试解码这个 json 时: "polls": [ { "title": "title", "date": "date", "summary": "summary", "stats
我正在尝试用我的 Codable 对象做一些自定义的事情。我的 JSON 对象使用多种类型的标记,因此我想让它们类型安全。为此,我创建了以下可编码类: class Token: Codable {
我尝试使用 Swift 4.1 的新功能在 JSON 解码过程中将蛇形命名法转换为驼峰命名法。 这是example : struct StudentInfo: Decodable { inte
我将以下结构发送到端点: struct IdleAlarmRequest: Encodable { let idleAlarm: [IdleAlarmParameters] enum
我正在使用 Codables 解析 JSON 数据。问题是我的几个编码键与变量名不同。为此,我使用了非常简单的 CodingKeys 枚举,但是我必须写下所有的键,我不想那样。我只想覆盖几个键,而不是
我正在尝试通过网络解析 JSON 数据。下面你可以看到魔法发生的地方。 func getBookingsForDate(date: String, completionHandler: @escapi
CodingKey 是否可以仅用于 JSONEncoder 而 JSONDecoder 使用默认成员名称? 例子我有以下结构 var str = """ { "name": "Endeavor", "
我尝试使用 Swift 4.1 的新功能在 JSON 解码期间将 snake-case 转换为 camelCase。 这是 example : struct StudentInfo: Decodabl
我有一个 struct 类型,其中列出了必须从 JSON 解码的不同类型,并且我找不到任何有关如何在我的 enum 中指定多个类型的信息,称为编码键。在最里面的字典中,有时一个键:值对将是 [Stri
我尝试从下面的 API 解码 API,但仍然收到以下错误: keyNotFound(CodingKeys(stringValue: "resources", intValue: nil), Swift
我是一名优秀的程序员,十分优秀!