はここ@PauloMattosからの回答をもとに、最終的構造体です木から):
extension Foo : CustomStringConvertible {
var description: String {
return stringDescription(self)
}
private func stringDescription(_ foo: Foo) -> String {
var string = ""
switch foo.kind {
case .leaf:
return foo.name
case .node(let nodes):
string += "\(foo.name): ("
for i in nodes.indices {
string += stringDescription(nodes[i])
// Comma seperate all but the last
if i < nodes.count - 1 { string += ", " }
}
string += ")"
}
return string
}
}
とサンプルテストコード:
let a = Foo(name: "A", kind: .leaf)
let b = Foo(name: "B", kind: .leaf)
let c = Foo(name: "C", kind: .leaf)
let d = Foo(name: "D", kind: .node([b, c]))
let root = Foo(name: "ROOT", kind: .node([a, d]))
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let jsonData = try! encoder.encode(root)
let json = String(data: jsonData, encoding: .utf8)!
print("Foo to JSON:")
print(json)
let decoder = JSONDecoder()
do {
let foo = try decoder.decode(Foo.self, from: jsonData)
print("JSON to Foo:")
print(foo)
} catch {
print(error)
}
出力:
Foo to JSON:
{
"name" : "ROOT",
"nodes" : [
{
"name" : "A"
},
{
"name" : "D",
"nodes" : [
{
"name" : "B"
},
{
"name" : "C"
}
]
}
]
}
JSON to Foo:
ROOT: (A, D: (B, C))
ニースの質問...しかし、私はスウィフトコンパイラはあなたのための 'Codoable'の実装を合成することができるようになりますとは思いません - - [コードを自分で書く]必要があるようです(https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types)。 –
覚えておいてください:JSONをどのように見せたいですか?または、すでにJSONを持っていて、それをSwiftに読みたいのですか? –
@ CodeDifferent私はJSON構造を気にせず、ツリーをシリアライズ/デシリアライズすることができます。 ;)関連付けられた型を持つ列挙型を処理するためにinit/encodeメソッドを実装する方法は知っていますが、関連する型はカスタム構造体の配列ではありません。 – joshd