自从我升级到Xcode 11和Swift 5.1后,我遇到了一个奇怪的问题--在可选变量被实例化之后,在Xcode调试器中仍可以显示为nil!
我有一个可选类变量名为booking
:
var booking: Booking?
它的类型是 Booking
:
public struct Booking: Codable {
var id: Int?
var start_time: Date?
var payment_currency: String = "USD"
var payment_amount: Int?
}
当我在代码中步进时,我可以看到booking
在它被分配之前... 它是空的,太好了:
然后,在它被分配之后... 等等,还是空的吗??:
我想知道它是否像一个懒变量一样被处理。 但它并不真正为空,因为它可以被访问:
寻找了一段时间之后,我想知道Xcode中的构建模式是否没有设置其“调试可执行文件”标志。 但是它确实有。 我甚至关闭和打开标志来清理和重建项目,以确保。
无论我在变量视图中查看booking
还是在控制台视图中输入p booking
,它都显示为空。
这里发生了什么? 我需要升级前具有的调试预测性。
更新
我简化了一个复现此问题的简单方法。 首先,创建一个空的单视图项目,并将其添加到AppDelegate.swift的顶部:
public struct Booking: Codable {
var start_time: Date?
var payment_currency: String = "USD"
}
然后将以下代码添加到 application(_:didFinishLaunchingWithOptions:) 函数中:
booking = Booking()
print("booking.payment_currency = \(booking?.payment_currency ?? "NULL")")
像之前一样设置断点并运行,注意到调试器显示booking为nil,即使已被赋值,就像我原来的情况一样。
然后注释掉 start_time
变量,重新运行,并注意到现在调试器在被赋值后显示booking
有一个值,正如人们所期望的那样。
因此,似乎结构体中的Date变量(无论是否可选)使调试变得混乱。具体来说,只要将变量更改为其他类型,例如Int、Int?、String或String?等等,就不会出现问题。
除非我漏掉了什么非常基本的东西,否则这对我来说似乎是Xcode调试器中的一个错误。如果是这样,最好的报告方法是在https://developer.apple.com/bug-reporting/进行报告吗?