Swift: DateFormatter 返回 nil

Swift: DateFormatter returning 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 和 Xcode11.4.1

调试器调试后,我明白了这是为什么。

之所以会出现这种情况,是因为Date。如果您将方法更改为 return 和 NSDate,调试器会正确显示它。

根据我的观察:此行为发生在 DateTimeZone 等其他类型所属的组中。也就是说,Foundation 中的 Swift 类型具有 Objective-C 对应项,但不是像 DateFormatter/NSDateFormatter 那样的 "direct port"。我真的不能很好地描述它,但它基本上是 Foundation 中的类型,他们的文档页面不允许你 select 右上角的 Objective-C 版本。 这种情况发生在 this page 中的大多数类型上,这些类型也在 Foundation 中。例外情况是:

  • AffineTransform
  • Data
  • DateInterval
  • Measurement
  • Notification

如果您使用另一个调试器命令 po,您会看到它正确显示 Dates。那么printpo有什么区别呢?

运行 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 是如何显示 "with formatting controlled by the type's author" 的。如果您键入 help expression,您将看到 expression-O 选项的作用:

Display using a language-specific description API, if possible.

所以可以得出结论 poprint 更多 "specific to Swift",因此它能够打印出 DateTimeZone 之类的东西]s,因为 print 根本不知道如何打印 Swift Date.