如何交互地玩 Xcode lldb swift repl 中的对象?

How to interactivly play with objects in the Xcode lldb swift repl?

假设我有一个涉及从数据库中选取文档的小程序:

let errorDatabase
= NSError(domain: "dk.myproject.couchbase", code: 0, userInfo: nil)

let rev = database.existingDocumentWithID("_design/" + designDocName)
// in xcode I set a break point here
assert(rev != nil)
if rev == nil {
    promise.failure(errorDatabase)
}

然后我插入一个断点,运行程序然后可以做:

(lldb) po rev
0x00007fad21df61c0
 {
  ObjectiveC.NSObject = {...}
}
(lldb) print rev.properties["views"]
(AnyObject?) $R29 = Some {
...

完美让我们输入 repl 并使用 rev 对象:

(lldb) repl
6> rev
repl.swift:6:1: error: use of unresolved identifier 'rev'
rev
^

我可能对 swift repl 有错误的期望 - 我期待某种 python、nodejs 或 scala repl。我可以摆弄物体等的行为

有什么提示吗?

我第一次在 LLDB 中输入 repl 时,我希望同样的事情发生,但我很快发现不幸的是你做不到。

事实证明,LLDB 中的 repl 是 运行 在顶层注入的模块中。因此,您可以从此处的 repl 中定义顶级对象和函数,然后在 "normal" lldb:

中可见
(lldb) repl
1> func pt() -> CGPoint {
2. return CGPointZero
3. }
4> :
(lldb) po pt()
(0.0, 0.0)

...但反之则不然:在 repl 中,您无法在暂停时看到局部变量,因为它们显然不在顶层的范围内。

但是请注意,您可以在 expr 表达式中执行赋值。因此,您可以更改局部变量的值、现有对象的属性等,只需说 expr 后跟一个赋值 - 而这个 does放置在您暂停的上下文中。

例如,假设我正在创建平移边缘手势识别器,我在这一行的断点处暂停:

p.edges = UIRectEdge.Right

现在:

(lldb) th step-over
(lldb) expr p.edges = UIRectEdge.Left
(lldb) continue

现在应用程序是 运行,但手势识别器在从左侧而不是右侧滑动时工作。

注意,我在这个问题中描述了"expression"和"repl"的用途和区别:

Xcode 6.1 'Swift REPL built into the Xcode debugger can inspect and manipulate your running app' not working

也许这会帮助您了解您所看到的相同点和不同点,然后了解它们背​​后的意图。