打印字典时,调试器究竟打印了什么?

时间:2016-11-21 20:33:56

标签: swift xcode debugging dictionary

我有一个[String : NSTimer]类型的字典。 当我使用断点在控制台中打印它时,我得到以下结果:

▿ 2 elements // Does this means 2 key-value pairs?
  ▿ [0] : 2 elements // What does this 2 element mean here?
    - .0 : "https://github.jack.com" // what does .0 mean here?
  ▿ [1] : 2 elements
    - .0 : "https://github.john.com"

但是,如果我使用Xcode中的变量视图,我可以看到对象的值为:

[0] (key: String, value: NSTimer)   
key String  "https://github.jack.com"   
value   NSTimer 0x00006100001726c0
[1] (key: String, value: NSTimer)   
key String  "https://github.john.com"   
value   NSTimer 0x00006000001756c0 // contrary to console, value is shown

这是一个错误吗?或者这是打印字典时的预期行为?如果是这样,为什么会这样?

[0],[1]也只是为了区分键?因为字典没有顺序。正确?

PS我还在我的代码中写了一些问题

1 个答案:

答案 0 :(得分:2)

首先,看起来你没有使用最新的(稳定的)Xcode,因为我的Xcode(版本8.1,8B62)说:

  

Swift编译错误:'NSTimer'已重命名为'Timer'

这个可怕的例子确实显示了“正常”输出:

let timerA = Timer(timeInterval: 123, repeats: false, block: { _ in })
let timerB = Timer(timeInterval: 123, repeats: false, block: { _ in })
let soExample: [String:Timer] = ["a":timerA, "b":timerB]
print(soExample)
dump(soExample)

在控制台中显示:

// ["b": <__NSCFTimer: 0x6000001738c0>, "a": <__NSCFTimer: 0x600000173440>]
// ▿ 2 key/value pairs
//   ▿ (2 elements)
//     - .0: "b"
//     - .1: <__NSCFTimer: 0x600000169180> #0
//       - super: NSTimer
//         - super: NSObject
//   ▿ (2 elements)
//     - .0: "a"
//     - .1: <__NSCFTimer: 0x600000169240> #1
//       - super: NSTimer
//         - super: NSObject

关于调试打印:

是的,您应该看到“2个键值对”。

然后是2个元素的元组:(键,值)...其中.0是第一个元组元素的简写。 (见The Swift Programming Language: Tuples

确实,dictionaries have no ordering

  

字典是键值关联的无序集合。

...所以我同意你的观点,在Xcode的Variables视图中,它的[0]和[1]可能会让新手感到困惑 - 正如你所看到的,控制台中的打印输出不会混淆。 ; - )