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

我想对intstring 使用默认解码,但我自己解码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 默认可解码实现,只有一个例外的主要内容,如果未能解决你的问题,请参考以下文章

oracle 例外

致命例外:JavaBridge - 只有创建视图层次结构的原始线程才能接触其视图

UIBarButtonItem 外观我需要一个例外

未来 iPhone 新品将全面支持人脸识别,只有它例外

在 Swift 中解码引用的可打印消息

正则表达式仅匹配大写“单词”,但有一些例外