Подтвердить что ты не робот

Decodable - наследование предотвращает синтез декодера init

У меня есть следующий класс 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

Есть три способа git избавиться от ошибки компилятора, но ни один из них не является хорошим:

  • Внедрите пустой метод init(from decoder: Decoder), который просто вызывает super.init(). Это, по-видимому, предотвращает синтез, означая, что ничто не становится фактически декодированным, потому что его просто пустой метод.

  • Внесите весь метод init(from decoder: Decoder) вручную. Это работает, но теперь удовольствие от использования Codable в значительной степени ушло.

  • Удалите все связанные с Realm коды. Теперь Codable работает так, как ожидалось, но теперь я больше не могу использовать Realm.

Это похоже на ошибку Swift для меня, потому что она должна обнаруживать, что init(from decoder: Decoder) фактически реализуется, просто не вручную.

Любые предложения или обходные пути, о которых я не знаю?

4b9b3361

Ответ 1

Это, похоже, было разрешено в Xcode 9 GM, который теперь позволяет инициализаторам синтезироваться Codable при наследовании от классов с помощью метода required init().