2017-06-28 38 views
12

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: ​​

  1. Wdrożenie pusty init(from decoder: Decoder) metoda, która po prostu wywołuje super.init(). Wydaje się to uniemożliwiać syntezę, co oznacza, że ​​nic nie jest faktycznie dekodowane, ponieważ jest to po prostu pusta metoda.

  2. Wykonaj ręcznie całą metodę init(from decoder: Decoder). To działa, ale teraz przyjemność z korzystania z Codable jest prawie nieobecna.

  3. 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?

+3

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

+5

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.) –

+0

Dobrze to usłyszeć. Sądzę, że do tego czasu pozostanę przy wdrażaniu ręcznie. – RamwiseMatt

Odpowiedz

0

Wydaje się, że zostało to rozwiązane w Xcode 9 GM, które teraz pozwala na syntezę inicjalizatorów przez Codable przy dziedziczeniu z klas metodą required init().