【问题标题】:Decodable - inheritance prevents decoder init from synthesizing可解码 - 继承防止解码器初始化合成
【发布时间】:2017-06-28 19:56:43
【问题描述】:

我有以下 Swift 4 Codable 类,它继承自 Realm 的 Object 类型:

final class SearchResult: RealmSwift.Object, Codable {
    @objc dynamic var name: String = ""
    @objc dynamic var region: String = ""

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case region = "region"
    }
}

这里的期望是init(from decoder: Decoder) 方法被合成,这样我就不必自己实现它,这是一个巨大的便利。但是,不执行此操作会产生以下编译器错误:

super.init isn't called on all paths before returning from initializer

git摆脱编译器错误的方法有3种,但都不好用:

  1. 实现一个空的init(from decoder: Decoder) 方法,它只调用super.init()。这似乎阻止了合成,这意味着实际上什么都没有被解码,因为它只是一个空方法。

  2. 手动实现整个init(from decoder: Decoder) 方法。这行得通,但现在使用Codable 的乐趣几乎消失了。

  3. 删除所有与 Realm 相关的代码。现在 Codable 可以正常工作了,但是,现在我不能再使用 Realm了。

这对我来说似乎是一个 Swift 错误,因为它应该检测到 init(from decoder: Decoder) 实际上正在实现,而不是手动实现。

有什么我不知道的建议或解决方法吗?

【问题讨论】:

  • bugs.swift.org/browse/SR-5122 上有一个 Swift 错误跟踪此问题。我建议还提交一份 Radar,让 Apple 知道变通办法造成的痛苦,并且你会重视修复。不过,我不确定这个问题的解决方法。
  • 是的,目前这是一个错误。类中的可编码一致性目前在一些地方被破坏,我希望尽快修复它。 (这是功能的重要组成部分,必须在发布前修复。)
  • 很高兴听到这个消息。我想在那之前我会坚持手工实现。
  • 临时解决方法:您可以使用 EVReflection/Realm 子规范来执行完全相同的操作。 (Swift 3 兼容,使用反射)github.com/evermeer/EVReflection/tree/master/Source/Realm 您只需将 Codable 更改为 EVReflectable,如果它们相同,则可以删除 CodingKeys,否则实现 propertyMapping 函数。
  • 核心数据同样的问题

标签: swift realm swift4 codable


【解决方案1】:

这似乎已在 Xcode 9 GM 中得到解决,它现在允许在从具有 required init() 方法的类继承时由 Codable 合成初始化程序。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多