Swift 5 默认可解码实现,只有一个例外
Posted
技术标签:
【中文标题】Swift 5 默认可解码实现,只有一个例外【英文标题】:Swift 5 Default Decododable implementation with only one exception 【发布时间】:2020-04-09 16:04:06 【问题描述】:有没有办法保持 Swift 对 Decodable 类的默认实现,只有 Decodable 对象但有一个例外? 因此,例如,如果我有这样的结构/类:
struct MyDecodable: Decodable
var int: Int
var string: String
var location: CLLocation
我想对int
和string
使用默认解码,但我自己解码location
。
所以在init(from decoder:)
我想要这样的东西:
required init(from decoder: Decoder) throws
<# insert something that decodes all standard decodable properties #>
// only handle location separately
let container = try decoder.container(keyedBy: CodingKeys.self)
location = <# insert custom location decoding #>
【问题讨论】:
为什么这被否决了???这是一个很好的问题。 也许将 location 属性放在它自己的结构中并覆盖init(from:)
那里仅用于该属性。也许有点矫枉过正......
感谢@JoakimDanielson,我也想过这个问题。它确实有效,但不幸的是它也不是很好:/ 很遗憾苹果没有提供类似的东西。
【参考方案1】:
有没有办法保持 Swift 对 Decodable 类的默认实现,只有 Decodable 对象但有一个例外
很遗憾,没有。要可解码,所有属性都必须是可解码的。如果您要编写自定义init
,您必须自己初始化(并因此解码)所有属性。
Apple 知道这很痛苦,并对此进行了一些思考,但现在为 Decodable 自定义 init
是全部或全部。
正如评论中所建议的,您可以通过将结构拆分为两种不同的类型来解决此问题。这样你就可以有一个只有一个属性的类型,你手动初始化它,你就完成了。
【讨论】:
以上是关于Swift 5 默认可解码实现,只有一个例外的主要内容,如果未能解决你的问题,请参考以下文章