【问题标题】:How can I access a swift convenience variable from objc in lldb?如何从 lldb 中的 objc 访问 swift 便利变量?
【发布时间】:2019-03-08 15:22:00
【问题描述】:

我正在尝试在 swift 上下文中设置一些便利变量并从 ObjC 上下文中访问它。

(lldb) expression -l swift -- var $answerSwift = 42
(lldb) expression -o -l swift -- $answerSwift
42
(lldb) expression -o -l objc -- $answerSwift
error: use of undeclared identifier '$answerSwift'

反之亦然:

(lldb) expression -l objc -- int $answerObjc = 42
(lldb) expression -o -l swift -- $answerObjc
42

如何将值从 swift 范围 (?) 移动到 objC 范围?

【问题讨论】:

  • 鉴于即使在普通代码中,Swift 全局变量在 ObjC 中也不可见,如果这完全不可能,我不会感到惊讶。 (在 Swift 表达式中添加 @objc 甚至不会解析。)
  • Swift Int 是结构而不是类。我不认为您可以在编译代码中访问 ObjC 中的 swift 结构,因此您也无法在调试器中访问。对象可以工作,但如果它们不能开箱即用,我不会感到惊讶。
  • 我使用 Ints 是因为我希望它们能成为一个好的、简单的例子。在我的初始设置中,我试图访问对象。

标签: objective-c swift lldb


【解决方案1】:

可以创建一个“临时上下文”,该上下文将被评估,然后通过将其放在反引号中作为变量传递给表达式。

所以这将适用于 swift 代码中的断点:

(lldb) expression -l swift -- var $answerSwift = 42
(lldb) expression -o -l objc -- `$answerSwift`
42

当我在 swift 代码中有断点时,我尝试像这样设置一个 objc var:

(lldb) expression -l objc -- id $label = (id)self.label
error: use of undeclared identifier 'self'

objc上下文无法访问swift变量self,所以失败了。

但是当将self.label 放在反引号中以创建临时 swift 上下文时,我可以将其分配给 objc 变量:

(lldb) expression -l objc -- id $label = (id)`self.label`
(lldb) expression -l objc -O -- $label
<UILabel: 0x7f8030c03c40; frame = (44 44; 42 21); text = 'Label'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x6000019b35c0>>

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多