12

我有以下 Swift 4Codable类,它继承自 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

有三种方法可以消除编译器错误,但没有一个是好的:

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

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

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

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

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

4

1 回答 1

0

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

于 2017-09-13T08:05:18.540 回答