codable和codingkeys(代码片段)

author author     2023-05-13     505

关键词:

我正在尝试实现一个与Codable使用CodingKeys枚举类似功能的协议。

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

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

我得到的最接近的是如下定义协议:

protocol TestProtocol 
    associatedType Keys: CodingKey

这要求实现者具有符合KeysCodingKey属性,但它不强制要求所有属性都有一个案例。此外,您不能像使用Keys一样将Codable属性声明为私有属性。

CodableCodingKeys的处理程度是否高于通过API公开的程度?

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

答案

你问两个问题。我会不按时回答。

Codable和CodingKeys的处理范围是否比通过API公开的更深层次?

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

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

EncodableDecodable要求也可以自动合成某些类型:

  1. 符合Encodable的类型,其属性都是Encodable,获得自动生成的String支持的CodingKey enum映射属性到案例名称。类似地,Decodable类型的属性都是Decodable
  2. 落入(1)的类型 - 以及手动提供CodingKey enum(直接命名为CodingKeys,或通过typealias)的类型,其案例按名称将1对1映射到Encodable / Decodable属性 - 自动合成init(from:)encode(to:) as适当的,使用这些属性和键
  3. 既不属于(1)也不属于(2)的类型必须提供自定义密钥类型(如果需要)并提供自己的init(from:)encode(to:),视情况而定

请注意,除非依赖于编译器合成的一致性,否则CodingKey兼容类型通常不必命名为CodingKeys或甚至是enum

此外,请注意,如果依靠编译器合成CodingKeysCodingKey,符合init(from:)encode(to:)类型只需要为其封闭类型的每个成员都有一个案例。

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

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

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

如果,通过“功能”,你的意思是编译器需要封闭类型的每个Encodable / Decodable成员的密钥成员的方式,那么唯一的方法是运行一个单独的程序来分析你的源代码和错误,如果有任何情况是失踪。你不能让标准的Swift编译器为你做这件事。

对于 Codable 结构,由于“私有”保护级别,“CodingKeys”不可访问

】对于Codable结构,由于“私有”保护级别,“CodingKeys”不可访问【英文标题】:\'CodingKeys\'isinaccessibledueto\'private\'protectionlevel,foraCodableStruct【发布时间】:2021-05-0323:57:04【问题描述】:我想检查打印语句是否打印“Key:messageTime... 查看详情

获取 CodingKeys 键值

】获取CodingKeys键值【英文标题】:GettheCodingKeyskeyvalue【发布时间】:2020-07-3119:17:21【问题描述】:在Swift中,使用Codable结构和CodingKeysemum,如果我有一个Coordinate对象,我怎样才能得到纬度和经度CodingKeys值,作为一个数组["1","2"]s... 查看详情

使用 Codable 解析 JSON 数据

...:typeMismatch(Swift.Dictionary,Swift.DecodingError.Context(codingPath:[CodingKeys(string 查看详情

使用 Codable 解析嵌套 JSON 数据问题

...JSON数据。但我对"route_polyline"field有疑问。问题:CodingKeys(stringValue:"route_polyline",intValue:n 查看详情

如何从 Swift Codable 中排除属性?

...些属性应该被编码,哪些应该被解码。我注意到从随附的CodingKeys枚举中排除该属性会 查看详情

swiftswift4中的codable(代码片段)

查看详情

swiftapikit_codable.swift(代码片段)

查看详情

swift公司的firestoreのrxswiftとの组み合わせ.codableも活用。(代码片段)

查看详情

在 Swift 4 中使用 Decodable 和 CodingKeys 解析 JSON

】在Swift4中使用Decodable和CodingKeys解析JSON【英文标题】:ParsingJSONusingDecodableandCodingKeysinSwift4【发布时间】:2017-10-1822:40:18【问题描述】:我正在尝试解析从URL检索的大型JSON字符串。我用来测试的JSON如下:letjson=""""feed":"title":"Harr... 查看详情

swift之codable自定义解析将任意数据类型解析为想要的类型(代码片段)

...和解码不同的数据都是必不可少的。这就是为什么Swift的CodableAPI能成为Swift4.0的新功能一部分时,具有如 查看详情

codable发布这么久我就不学,摸鱼爽歪歪,哎~就是玩儿(代码片段)

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索HelloWorld杰少即可关注。写在开头祝天下所有伟大的母亲:节日快乐,身体健康,感谢您的付出,感谢您的仁爱!----写在母亲节当天... 查看详情

codable发布这么久我就不学,摸鱼爽歪歪,哎~就是玩儿(代码片段)

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索HelloWorld杰少即可关注。写在开头祝天下所有伟大的母亲:节日快乐,身体健康,感谢您的付出,感谢您的仁爱!----写在母亲节当天... 查看详情

Alamofire:具有额外属性的可编码对象

...在iOS上可能吗?为了符合Codable协议,我需要将它添加到CodingKeys枚举中,但如果我这样做了,它 查看详情

使用 Alamofire/Codable 解析 JSON 行

】使用Alamofire/Codable解析JSON行【英文标题】:ParsingJSONLineswithAlamofire/Codable【发布时间】:2018-03-0718:57:57【问题描述】:是否可以用Alamofire和codable解析JSON行?这是我现在的代码。Alamofire.request(url,method:.get,parameters:parameters,encoding:U... 查看详情

Swift 4 Decodable - 没有与键 CodingKeys 关联的值 [重复]

】Swift4Decodable-没有与键CodingKeys关联的值[重复]【英文标题】:Swift4Decodable-NovalueassociatedwithkeyCodingKeys[duplicate]【发布时间】:2019-08-2822:38:18【问题描述】:我正在我的Swift应用程序中解码JSON响应,并且代码在它决定停止工作之前... 查看详情

解码 JSON 时出错 - keyNotFound(CodingKeys

】解码JSON时出错-keyNotFound(CodingKeys【英文标题】:ErrorwhendecodingJSON-keyNotFound(CodingKeys【发布时间】:2018-11-1914:58:47【问题描述】:我正在尝试通过网络解析JSON数据。下面你可以看到魔法发生的地方。funcgetBookingsForDate(date:String,comp... 查看详情

使用 URLSession 和 Codable 解析 JSON 数据

】使用URLSession和Codable解析JSON数据【英文标题】:ParsingJSONdatawithURLSessionandCodable【发布时间】:2019-12-0212:13:42【问题描述】:我使用URLSession解析JSON并使用Codable映射它,但我无法在JSON数据中获取result数组以在表格视图中显示它... 查看详情

如何使用 Codable 和 Swift 解析这个嵌套的 JSON?

】如何使用Codable和Swift解析这个嵌套的JSON?【英文标题】:HowdoIparsethisnestedJSONusingCodablewithSwift?【发布时间】:2019-07-2109:15:07【问题描述】:我正在尝试使用Codable解析这个JSON:"users":["id":1,"name":"AllenCarslake","userName":"acarslake0","pro... 查看详情