2017-06-28 14 views
12

を合成からデコーダ初期化を防ぎ、私持っているレルムのObject型から継承し、次のスウィフト4 Codableクラス、:復号可能 - 継承は

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には3つの方法があり、それらのどれもが良いではない:

  1. が空init(from decoder: Decoder)を実装しかし、これを実施しないと、次のコンパイラエラーを生成しますこのメソッドはsuper.init()を呼び出します。これは合成を妨げるようですが、実際には何もデコードされないことを意味します。

  2. 手全体でinit(from decoder: Decoder)メソッドを実装します。これは動作しますが、今ではCodableを使用する喜びはほとんどなくなりました。

  3. レルム関連のコードをすべて削除します。現在、Codableは期待どおりに動作しますが、今はもうRealmを使用できません。

それはinit(from decoder: Decoder)は実際にだけではない手で、実装されていることを検出する必要がありますので、これは、私にはスウィフトバグのように思えます。

わからないことはありますか?

+3

https://bugs.swift.org/browse/SR-5122にこの問題を追跡するスウィフトバグがあります。私はまた、レーダーを提出して、Appleに回避策がもたらす苦痛を知らせ、あなたが修正を評価することを提案することをお勧めします。しかし、この問題の回避策についてはわかりません。 – bdash

+5

これは現在バグです。クラスのコーディング可能な適合性は、現在、いくつかの箇所で壊れており、私はすぐにそれを修正しようとしています。 (これは機能の重要な部分であり、リリース前に修正する必要があります) –

+0

これは良いことです。私はそれまでに手作業で実装することに固執すると思います。 – RamwiseMatt

答えて

0

これはXcode 9 GMで解決されたようですが、required init()メソッドを持つクラスから継承すると、初期化子をCodableで合成できるようになりました。

関連する問題