2017-06-15 3 views
2

例:リファレンスタイプでCodableプロトコルを使用するにはどうすればよいですか?

import Foundation 

class Player: Codable { 
    let name: String 
    init(name: String) { 
     self.name = name 
    } 
} 

class Team: Codable { 
    let players: [Player] 
    let capitan: Player 
    init(players: [Player], capitan: Player) { 
     self.players = players 
     self.capitan = capitan 
    } 
} 

let player1 = Player(name: "p1") 
let player2 = Player(name: "p2") 

let team = Team(players: [player1, player2], capitan: player1) 

print(team.players[0] === team.capitan) // true 

let encoder = JSONEncoder() 
let data = try encoder.encode(team) 

let decoder = JSONDecoder() 
let team2 = try decoder.decode(Team.self, from: data) 

print(team2.players[0] === team2.capitan) // false 

出力:参照型でコード可能なプロトコルを使用する方法

true 
false 

今後の動作は変わることがありますか? https://github.com/apple/swift-evolution/blob/master/proposals/0167-swift-encoders.md

+0

参照型が必要です – rtnm

答えて

6

これはJSONの基本であり、Codableではありません。 JSONは値のエンコーディングです。参照を追跡しません。それはフォーマットの一部ではありません。参照を追跡したい場合は、コードをobjectIdentifierでJSONに保存する必要があります。同じ識別子を持つものに参加する必要があります。しかし、基本的なフォーマットにはその概念がないため、これはCodableの対象外です。 NSKeyedArchiverが基本値フォーマットとしてプロパティリストを使用する方法で、JSONをその基礎となる値フォーマットとして使用した他のフォーマットを作成する必要があります。

JSONはオブジェクトグラフの格納形式ではありません。私が言ったように、値のエンコーディングです。オブジェクトグラフが必要な場合は、NSKeyedArchiverが対象です。ココア以外のソリューションが必要な場合は、アーカイバと同じ基本概念を実装した新しいEncoderDecoderを実装する必要があります。それはJSONEncoderのためではありません。可能であれば、NSKeyedArchiverを使用します。これのために設計されています。 SE-0167はあなたがNSCoding種類とCodable種類を混在させ(とスウィフトタイプはNSKeyedArchiverに参加できるよう)になっているNSKeyedArchiver上の新しいencodeCodable方法があると言うが、私はそれを見ていないことを

注意Xcode 9 beta 1.

+0

https:///0167-swift-encoders.md 将来、NSKeyedArchiverはメソッドencodeCodableをサポートします。 しかし、私はテキストベースのストレージ形式(JSON)を開きたいと思います。 – rtnm

+0

"アーカイバと同じ基本的なアイデアを実装した新しいエンコーダとデコーダを実装する必要があります。" - これは変種です – rtnm

+0

今日はstdlibに存在しません。それを見つけたり構築したりする必要があります。 –

1

現在、エンコーダは参照を尊重していないようですが、その代わりにそれが参照されるたびに同じオブジェクトであるため、===が失敗します。あなたは==に変更し、この問題を解決するクラスのためにEquatableを実装するか、質問状態のコメントとしてstructを使用することができます。

+0

デコード後に正確なコピーを取得したいと思います。 – rtnm

関連する問題