swift - 实例化的可选变量在 Xcode 调试器中显示为 nil

标签 swift xcode debugging xcode11 swift5

自从我升级到 Xcode 11 和 Swift 5.1 以来,我遇到了一个奇怪的问题——实例化可选变量后,它仍然可以在 Xcode 调试器中显示为 nil!

我有一个名为 booking 的可选类变量:

var booking: Booking?

其类型为预订:

public struct Booking: Codable {
    var id: Int?
    var start_time: Date?
    var payment_currency: String = "USD"
    var payment_amount: Int?
}

当我单步执行代码时,我可以在分配之前看到 booking...它是零,太棒了:

enter image description here

然后分配后...什么,仍然为零??:

enter image description here

我想知道它是否被视为一个惰性变量。但它并不是真的为零,因为它可以被访问:

enter image description here

搜索了一段时间后,我想知道 Xcode 中的构建模式是否没有设置“调试可执行文件”标志。但确实如此。为了确保这一点,我什至在标志关闭和打开的情况下清理和重建了该项目。

enter image description here

无论我在变量 View 中查看 booking 还是在控制台 View 中输入 p booking,它都显示为 nil。

这是怎么回事?我需要在这次升级之前进行调试的可预测性。

更新

我提炼出一种简单的方法来重现该问题。首先,创建一个空的单 View 项目并将其添加到 AppDelegate.swift 的顶部:

public struct Booking: Codable {
    var start_time: Date?
    var payment_currency: String = "USD"
}

然后将这些行添加到 application(_:didFinishLaunchingWithOptions:) func:

booking = Booking()
print("booking.payment_currency = \(booking?.payment_currency ?? "NULL")")

像以前一样设置断点,运行时,请注意调试器即使在分配后也显示 booking 为 nil,就像我原来的情况一样。

然后注释掉 start_time 变量,重新运行,并注意现在调试器显示 booking 在分配后有一个值,正如人们所期望的那样。

因此,在这样的结构中,日期变量(无论可选与否)似乎都会使调试变得困惑。特别是日期变量——将变量更改为其他类型,如 Int、Int?、String、String?...,没有问题。

除非我遗漏了一些非常基本的东西,否则这对我来说似乎是 Xcode 调试器中的一个错误。如果是这样,报告该问题的最佳方式是在 https://developer.apple.com/bug-reporting/

最佳答案

我似乎在 Xcode 11 中发现了一个错误。正如上面的更新中所述,它很容易重现。我已向 Apple 提交了该错误。

我现在仍在寻找解决方法,因为我使用了很多包含日期变量的结构。如果有人能找到,请在下面评论。

关于swift - 实例化的可选变量在 Xcode 调试器中显示为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58640221/

相关文章:

c# - 使用 stacktrace/stackframe 进行反射以获取方法名称和参数

swift - 二元运算符 * 不能应用于 Int 和 Double 类型的操作数

ios - init的可选性?(coder :) vs init(coder:). 如果nil怎么办?

ios - X代码 7.3.1, "Undefined symbols for architecture arm64"

ios - iPad 总是横向启动

ios - 如何从OSS存储库的源代码创建和导出iOS框架?

java - Selenium java : how to know which DOM element is pointed by a WebElement?

ios - 以编程方式快速添加两个 View 之间的垂直间距

swift - 查询嵌套数据如何工作?我还能检索下一级的数据吗?

debugging - 为什么一个mapreduce作业的本地字节写值比其他大?