2017-08-07 16 views
1

私は単純な音楽シーケンサーアプリケーションを開発しています。この種のアプリは複雑なデータ構造を持つ傾向があり、保存/ロードする必要があるので、Swift4にCodableプロトコルを導入することはまったく良いニュースです。Swift4 Condable:プロパティを除外できません

私の問題はこれです: 私は非コーディング可能なプロパティを持っている必要があります。これは、アプリケーションがアクティブな間に一時的な変数が生きているだけなので、コード化する必要はありません。 CodingKeyを実装して除外しようとしましたが、コンパイラは "Type 'Song'がプロトコル 'Decodable'に準拠していないというエラーを表示します。

具体的には、以下のコードで「musicSequence」を除外します。

誰かがアイデアを持っていますか?

class Song : Codable { //Type 'Song' does not conform to protocol 'Decodable' 
    var songName : String = "";  
    var tempo : Double = 120; 

    // Musical structure 
    var tracks : [Track] = [] // "Track" is my custom class, which conforms Codable as well  
    // Tones 
    var tones = [Int : ToneSettings](); // ToneSettings is also my custom Codable class 

    var musicSequence : MusicSequence? = nil; // I get the error because of this line 

    private enum CodingKeys: String, CodingKey { 
     case songName 
     case tempo 
     case tracks 
     case tones 
    } 

    func createMIDISequence() { 
     // Create MIDI sequence based on "tracks" above 
     // and keep it as instance variable "musicSequence" 
    } 
} 
+0

Xcode 9ベータ5でテストした限り、コードは問題なくコンパイルされ、/ encodeから "musicSequence"なしでJSONデータにデコードできます。古いベータ版で試した場合、古いベータ版のバグかもしれません。ベータ5でコードをテストし、説明したエラーが発生した場合は、他の部分が影響を受ける可能性があるため、問題を再現するためにさらにコンテキストを表示する必要があります。チェックしてください。 – OOPer

+0

私はまだベータ3を使用していました。それはbeta5でコンパイルされました!ありがとう –

答えて

1

(イベントの奇妙なターンは、以下を参照してください。)CodingKeys

ご利用には、すでにあなたがエンコードの世話をしています。あなたはまだ無料でそれを取得します。しかし、あなたは手でデコードを処理するために、どのようにシステムに指示する必要があります

required init(from decoder: Decoder) throws { 
    let values = try decoder.container(keyedBy: CodingKeys.self) 
    songName = try values.decode(String.self, forKey: .songName) 
    tempo = try values.decode(Double.self, forKey: .tempo) 
    tracks = try values.decode([Track].self, forKey: .tracks) 
    tones = try values.decode([Int: ToneSettings].self, forKey: .tones) 
} 

それはかなりそのmusicSequence缶を把握すると、とにかくあまりにもスマートになりnil(多分にデフォルトで設定される必要があり、十分にスマートではありません)。

bugs.swift.orgのディフェンダーを開いて、このDecodableを自動にすることをお勧めします。それはあなたがCodingKeysを提供し、デフォルト値がある場合にそれを理解することができるはずです。


編集:私が最初にこれに答えたとき、私はあなたのエラーを正確に複製しました。しかし、私は再びあなたのコードを新鮮にコピーしようとしましたが、エラーは表示されません。次のコードはコンパイルされ、プレイグラウンドで実行されます:

import Foundation 

struct Track: Codable {} 
struct ToneSettings: Codable {} 
struct MusicSequence {} 

class Song : Codable { //Type 'Song' does not conform to protocol 'Decodable' 
    var songName : String = ""; 
    var tempo : Double = 120; 

    // Musical structure 
    var tracks : [Track] = [] // "Track" is my custom class, which conforms Codable as well 
    // Tones 
    var tones = [Int : ToneSettings](); // ToneSettings is also my custom Codable class 

    var musicSequence : MusicSequence? = nil; // I get the error because of this line 

    private enum CodingKeys: String, CodingKey { 
     case songName 
     case tempo 
     case tracks 
     case tones 
    } 

    func createMIDISequence() { 
     // Create MIDI sequence based on "tracks" above 
     // and keep it as instance variable "musicSequence" 
    } 
} 

let song = Song() 
let data = try JSONEncoder().encode(song) 
String(data: data, encoding: .utf8) 

let song2 = try JSONDecoder().decode(Song.self, from: data) 

ここにコンパイラのバグがあるのでしょうか。これを新しいベータ版でテストしてください。

+0

私も上記のように、それはベータ5に準拠した。しかし、あなたの情報はまだ有用です。ありがとう! –

+0

親愛なる@ Yokemura竹村Rob Napierは、xcode9 GMでコンパイルエラーなしで完全に作業していると述べています。キーラインは、コード化可能でないキーをオプションとして作成し、デフォルト値を割り当てる必要があります。 –

関連する問題