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
,调试器会正确显示它。
根据我的观察:此行为发生在 Date
和 TimeZone
等其他类型所属的组中。也就是说,Foundation
中的 Swift 类型具有 Objective-C 对应项,但不是像 DateFormatter
/NSDateFormatter
那样的 "direct port"。我真的不能很好地描述它,但它基本上是 Foundation
中的类型,他们的文档页面不允许你 select 右上角的 Objective-C 版本。 这种情况发生在 this page 中的大多数类型上,这些类型也在 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
是如何显示 "with formatting controlled by the type's author" 的。如果您键入 help expression
,您将看到 expression
的 -O
选项的作用:
Display using a language-specific description API, if possible.
所以可以得出结论 po
比 print
更多 "specific to Swift",因此它能够打印出 Date
和 TimeZone
之类的东西]s,因为 print
根本不知道如何打印 Swift Date
.
我遇到一个奇怪的问题,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
,调试器会正确显示它。
根据我的观察:此行为发生在 这种情况发生在 this page 中的大多数类型上,这些类型也在 Date
和 TimeZone
等其他类型所属的组中。也就是说,Foundation
中的 Swift 类型具有 Objective-C 对应项,但不是像 DateFormatter
/NSDateFormatter
那样的 "direct port"。我真的不能很好地描述它,但它基本上是 Foundation
中的类型,他们的文档页面不允许你 select 右上角的 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
是如何显示 "with formatting controlled by the type's author" 的。如果您键入 help expression
,您将看到 expression
的 -O
选项的作用:
Display using a language-specific description API, if possible.
所以可以得出结论 po
比 print
更多 "specific to Swift",因此它能够打印出 Date
和 TimeZone
之类的东西]s,因为 print
根本不知道如何打印 Swift Date
.