発端
以下のような [String: AnyObject]
なDictionary(例えばAPIレスポンスのjsonから生成されたもの)を実行時にLLDBでサクッと確認したい、というケースがデバッグ中に発生することもあるでしょう。
let dog = ["id": 1, "name": "アレキサンダー", "owner": "ニーナ", "age": 10, "children": [["id": 2, "name": "ポチ", "owner": "ニーナ", "age": 3, "children": NSNull()], ["id": 3, "name": "チビ", "owner": "ニーナ", "age": 2, "children": NSNull()]]]
その際、 po
するとこんな感じになって非常に見難いです…
(lldb) po dog
▿ 5 elements
▿ [0] : 2 elements
- .0 : "owner"
- .1 : ニーナ
▿ [1] : 2 elements
- .0 : "age"
▿ [2] : 2 elements
- .0 : "id"
▿ [3] : 2 elements
- .0 : "children"
▿ .1 : 2 elements
▿ [0] : 5 elements
▿ [0] : 2 elements
- .0 : owner
- .1 : ニーナ
▿ [1] : 2 elements
- .0 : age
▿ [2] : 2 elements
- .0 : id
▿ [3] : 2 elements
- .0 : children
▿ [4] : 2 elements
- .0 : name
- .1 : ポチ
▿ [1] : 5 elements
▿ [0] : 2 elements
- .0 : owner
- .1 : ニーナ
▿ [1] : 2 elements
- .0 : age
▿ [2] : 2 elements
- .0 : id
▿ [3] : 2 elements
- .0 : children
▿ [4] : 2 elements
- .0 : name
- .1 : チビ
▿ [4] : 2 elements
- .0 : "name"
- .1 : アレキサンダー
解決案
1. p
を使う
ずいぶん見やすくなりますが、入れ子になっているchildrenの中身が見れないのでちょっと実用的じゃない感じです。
(lldb) p dog
([String : NSObject]) $R1 = 5 key/value pairs {
[0] = {
key = "owner"
value = "ニーナ"
}
[1] = {
key = "age"
value = 0xb0000000000000a3 Int64(10)
}
[2] = {
key = "id"
value = 0xb000000000000013 Int64(1)
}
[3] = {
key = "children"
value = 0x00007fd841702e40 {}
}
[4] = {
key = "name"
value = "アレキサンダー"
}
}
2. po print(<#value#>)
を使う
マルチバイト文字列がエンコードされちゃってますが、非常に見やすいです。
(lldb) po print(dog)
["owner": ニーナ, "age": 10, "id": 1, "children": <__NSArrayI 0x7fd841702e40>(
{
age = 3;
children = "<null>";
id = 2;
name = "\U30dd\U30c1";
owner = "\U30cb\U30fc\U30ca";
},
{
age = 2;
children = "<null>";
id = 3;
name = "\U30c1\U30d3";
owner = "\U30cb\U30fc\U30ca";
}
)
, "name": アレキサンダー]
結論
po print(<#value#>)
を使いましょう・ω・