Mam następujący Swift 4 Codable
klasa, która dziedziczy z królestwa typ obiektu:dekodowalnej - dziedziczenie zapobiega dekodera Init z syntetyzowania
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"
}
}
Oczekiwanie tutaj jest to, że metoda init(from decoder: Decoder)
zostanie zsyntetyzowany tak, że nie mam samemu go wdrożyć, co jest ogromną wygodą. Jednak nie realizacji to daje następujący błąd kompilatora:
super.init isn't called on all paths before returning from initializer
Istnieją trzy sposoby, aby git pozbyć błędu kompilatora, ale żaden z nich są dobre:
Wdrożenie pusty
init(from decoder: Decoder)
metoda, która po prostu wywołujesuper.init()
. Wydaje się to uniemożliwiać syntezę, co oznacza, że nic nie jest faktycznie dekodowane, ponieważ jest to po prostu pusta metoda.Wykonaj ręcznie całą metodę
init(from decoder: Decoder)
. To działa, ale teraz przyjemność z korzystania zCodable
jest prawie nieobecna.Usuń cały kod związany z krainą. Teraz Codable działa zgodnie z oczekiwaniami, ale cóż, teraz nie mogę już używać Realm.
Wydaje się to Swift bug do mnie, ponieważ powinien wykryć, że init(from decoder: Decoder)
jest w rzeczywistości realizowana, nie tylko ręcznie.
Jakieś sugestie lub obejścia, o których nie wiem?
Istnieje bug Swift śledzący ten problem na stronie https://bugs.swift.org/browse/SR-5122. Sugerowałbym również złożenie radaru, aby Apple wiedział, jaki ból powoduje ten problem, i że warto go naprawić. Nie jestem jednak pewien na temat obejścia tego problemu. – bdash
Tak, to jest obecnie błąd. Kodowalna zgodność w klasach jest obecnie uszkodzona w kilku miejscach i zamierzam ją wkrótce naprawić. (Jest to ważna część funkcji i musi zostać naprawiona przed wydaniem.) –
Dobrze to usłyszeć. Sądzę, że do tego czasu pozostanę przy wdrażaniu ręcznie. – RamwiseMatt