使用Swift Codable对一致性类型的演变有什么影响?

使用Swift Codable对一致性类型的演变有什么影响?,swift,serialization,Swift,Serialization,当我学习Swift 4的可编码协议并思考如何使用该协议时,我想了解使其可编码时对类型未来潜在演变的影响 在通常的代码中,如果我通过向类型添加属性来更改类型,我只需要更新本地代码库以响应此更改(例如,通过向我的类型初始化器调用添加新参数) 另一方面,如果我的类型是可编码的,并且我已经将它与远程服务器结合使用(通过发送和接收编码为JSON的类型),那么添加新属性不是很有问题吗 例如,假设我收到一个由我的应用程序的前一个版本(仍然由服务器存储)编码的JSON,并且我尝试用新版本对其进行解码,解码过程将

当我学习Swift 4的
可编码
协议并思考如何使用该协议时,我想了解使其
可编码
时对类型未来潜在演变的影响

在通常的代码中,如果我通过向类型添加属性来更改类型,我只需要更新本地代码库以响应此更改(例如,通过向我的类型初始化器调用添加新参数)

另一方面,如果我的类型是
可编码的
,并且我已经将它与远程服务器结合使用(通过发送和接收编码为JSON的类型),那么添加新属性不是很有问题吗

例如,假设我收到一个由我的应用程序的前一个版本(仍然由服务器存储)编码的JSON,并且我尝试用新版本对其进行解码,解码过程将失败,因为新属性的数据将不可用

我应该如何处理这种情况?
在某个时刻“锁定”我的类型,禁止它在未来发展?

如果真的需要不兼容的数据,用什么最干净的方法来解码它?

相关:@JoshCaswell这很有趣!但这似乎并不能解决接收以前版本编码的JSON的问题,是吗?@JoshCaswell因为在Swift中所有属性都必须初始化,所以我看到的唯一解决方案是将新属性设置为可选,但我不知道自动解码过程会如何反应……如果不需要新字段,声明它是可选的,
Decodable
将优雅地处理它在JSON中的缺失。如果它不是可选的并且没有默认值,那么它显然不是向后兼容的更改。如果它是一个与web服务交换的内容完全无关的新属性,那么您可以显式声明您的
CodingKeys
,并从中省略此字段,这样它就根本不会考虑到
可解码的
。我刚才说它是相关的!:)并不是说它有所有的答案。