Ответ 1
Это, похоже, было разрешено в Xcode 9 GM, который теперь позволяет инициализаторам синтезироваться Codable при наследовании от классов с помощью метода required 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)
фактически реализуется, просто не вручную.
Любые предложения или обходные пути, о которых я не знаю?
Это, похоже, было разрешено в Xcode 9 GM, который теперь позволяет инициализаторам синтезироваться Codable при наследовании от классов с помощью метода required init()
.