LoginSignup
22
20

More than 5 years have passed since last update.

SwiftのDictionaryをLLDBで確認する時のtips

Posted at

発端

以下のような [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#>) を使いましょう・ω・

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20