可解码 - 继承阻止解码器init合成

时间:2017-06-28 19:56:43

标签: swift realm swift4 codable

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

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了。

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

    我不知道的任何建议或解决方法?

1 个答案:

答案 0 :(得分:0)

这似乎已在Xcode 9 GM中解决,现在允许Codable在使用required init()方法继承类时合成初始化器。