【问题标题】:Xcode 6 just displays the text "Some" as only value for my Swift class objectsXcode 6 只显示文本“Some”作为我的 Swift 类对象的唯一值
【发布时间】:2014-09-29 07:01:08
【问题描述】:

我正在尝试调试为什么 UIButton 没有显示在由 Swift 编写的键盘扩展显示的视图中。当它在 LLDB 调试器(Xcode 6.0.1)中显示为

dismissButton = (UIButton!) Some

我尝试使用变量前面的小层次箭头检查它的联系人,但是当我切换它时没有显示任何内容。

我尝试用 PO 打印出来并得到

<UIButton: 0x7fa673e0c6f0; frame = (27 14; 183 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fa673e0b680>>

充其量似乎不完整(隐藏在哪里?)

有没有办法直接检查 LLDB 中 Swift 类对象的属性?我无法使用 View Hierarchy 调试器,因为无论我尝试使用哪种模拟器(iOS 8 从 4s 到 6),都不会为此项目启用“Capture View Hierarchy”。

编辑:根据恩里科的建议

(lldb) frame var -d run -- self.dismissButton
(UIButton!) self.dismissButton = Some {}

我用谷歌搜索,但没有找到任何关于“Some”在调试器上下文中的含义的文档。想知道我是否对项目有一些配置问题。容器 App 也是 Swift,但只是一个模板应用程序,完全采用 Xcode 6.0.1 生成的默认值。

Edit2:Enrico,只需输入 'frame var' 就会产生详细的输出,其中包含以下内容

  dismissButton = Some {
    Some = 0x00007fb90261f2e0 {
      UIKit.UIControl = {
        UIKit.UIView = {
          UIKit.UIResponder = {
            ObjectiveC.NSObject = {}
          }
        }
      }
    }
  }

更有趣的是,很高兴发现 Some 实际上意味着什么(不确定它是否是 nil 的特例版本),但仍然需要一种方法来更深入地挖掘对象。

【问题讨论】:

  • “不完整”的 po 输出不是 LLDB 问题(po 由框架驱动,而不是由我们驱动)
  • 至于“Some”,我很惊讶如果您展开打开它并没有向您显示指针值。你可以试试 (lldb) frame var -d run --dismissButton

标签: ios xcode swift lldb


【解决方案1】:

由于您的 UIButton 是 Swift 可选的(注意名称末尾的爆炸符号),它的类型不是 UIButton,而是 Swift.ImplicitlyUnwrappedOptional

这是一个有两种情况的枚举

enum IOU<T> {
  case Some(T)
  case None
}

您所看到的只是:与“此可选包含一个 UIButton”相对应的枚举的情况

不幸的是,我认为 6.0.1 不会让你走得比你已经走得更远。 po-ing 有效,因为它知道代表您打开包装。

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2021-09-21
    • 2017-07-05
    • 2020-04-04
    • 2017-01-21
    • 2020-03-20
    相关资源
    最近更新 更多