首页 > 解决方案 > Swift:DateFormatter 返回 nil

问题描述

我遇到了一个奇怪的问题,即 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

标签: swiftmacosnsdateformatter

解决方案


在玩了一些调试器之后,我弄清楚了为什么会这样。

发生这种情况的原因是因为它是Date. 如果您将方法更改为返回NSDate,调试器会正确显示它。

根据我观察到的情况:这种行为发生在 的类型组Date和其他类型中TimeZone。也就是说,Swift 类型Foundation具有对应的 Objective-C,但不是像DateFormatter/那样的“直接端口” NSDateFormatter。我不能很好地描述它,但基本上是Foundation他们的文档页面不允许您在右上角选择 Objective-C 版本的类型。此页面上的大多数类型也会发生这种情况,这些类型也在Foundation. 例外情况是:

  • AffineTransform
  • Data
  • DateInterval
  • Measurement
  • Notification

如果您使用另一个调试器命令 ,po您将看到它Date正确显示 s。print那么和 和有什么区别po呢?

运行help printhelp 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,您将看到该-O选项的expression作用:

如果可能,使用特定于语言的描述 API 显示。

因此可以得出结论,po它比 Swift 更“特定于 Swift” print,因此它能够打印出DateTimeZones 之类的东西,因为print根本不知道如何打印 Swift Date


推荐阅读