Swift:DateFormatter 返回 nil
Posted
技术标签:
【中文标题】Swift:DateFormatter 返回 nil【英文标题】:Swift: DateFormatter returning nil 【发布时间】:2020-05-10 10:55:11 【问题描述】:我遇到了一个奇怪的问题,即 DateFormatter 返回 nil 以获得有效的数据字符串。
这是我的代码:
func dateFromString(_ dateString:String, format: String = "dd/MM/yy") -> Date?
let dueDateFormatter = DateFormatter()
dueDateFormatter.timeZone = TimeZone(identifier: "UTC")!
dueDateFormatter.dateFormat = format
let date = dueDateFormatter.date(from: dateString)
return date
func applicationDidFinishLaunching(_ aNotification: Notification)
print("Launched")
let dd = dateFromString("Aug 20", format: "MMM yy")
print (dd!)
在调试器中:
似乎该变量已设置并且可以在应用程序中使用,但调试器没有显示它。这是 Xcode 的错误还是我要疯了?
在操场上一切正常,我在代码的其他区域多次使用此功能。
我使用的是 10.15.4 和 Xcode 11.4.1
【问题讨论】:
我从未见过有人在调试器中使用print
。我一直使用po
。 po dd
产生了什么?
调试器输出清楚地显示来自您的print(dd!)
的“2020-07-31 23:00:00 +0000”
对于固定日期格式,强烈建议将格式化程序的Locale
设置为en_US_POSIX
,尤其是在处理月份字符串时。
【参考方案1】:
在调试器上玩了一会后,我明白了这是为什么。
发生这种情况的原因是因为它是Date
。如果您更改方法以返回 NSDate
,调试器将正确显示它。
根据我的观察:这种行为发生在 大多数类型都会发生这种情况this page 也在 Date
和其他诸如TimeZone
所属的类型组中。也就是说,Foundation
中的 Swift 类型具有 Objective-C 对应项,但不是像 DateFormatter
/NSDateFormatter
这样的“直接端口”。我不能很好地描述它,但基本上是 Foundation
中的类型,他们的文档页面不允许您在右上角选择 Objective-C 版本。Foundation
中。例外情况是:
AffineTransform
Data
DateInterval
Measurement
Notification
如果您使用另一个调试器命令po
,您会看到它正确显示Date
s。那么print
和po
有什么区别呢?
运行help print
和help po
可以告诉我们:
print
:
Evaluate an expression on the current thread. Displays any returned value with LLDB's default formatting. Expects 'raw' input (see 'help raw-input'.) Syntax: print <expr> Command Options Usage: print <expr> 'print' is an abbreviation for 'expression --'
po
:
Evaluate an expression on the current thread. Displays any returned value with formatting controlled by the type's author. Expects 'raw' input (see 'help raw-input'.) Syntax: po <expr> Command Options Usage: po <expr> 'po' is an abbreviation for 'expression -O --'
注意po
是如何表示“格式由类型的作者控制的”。如果您输入help expression
,您将看到expression
的-O
选项的作用:
如果可能,使用特定语言的描述 API 显示。
因此可以得出结论,po
比 print
更“特定于 Swift”,因此它能够打印出诸如 Date
和 TimeZone
s 之类的内容,因为 print
根本不会不知道如何打印 Swift Date
。
【讨论】:
以上是关于Swift:DateFormatter 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章
您可以使用 Swift DateFormatter 获取 Date 对象,对其进行格式化,然后将其作为 Date 对象返回吗?
DateFormatter 中的 Swift 语言错误? [复制]
在swift中使用DateFormatter时发生错误[重复]