执行以下代码:
public enum Month : String {
case January = "JAN"
case February = "FEB"
case March = "MAR"
case April = "APR"
case May = "MAY"
case June = "JUN"
case July = "JUL"
case August = "AUG"
case September = "SEP"
case October = "OCT"
case November = "NOV"
case December = "DEC"
func toDate() -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MMM.yyyy hh:mm a"
let dateString = "01.(self.rawValue).2016 12:00 PM"
return dateFormatter.date(from: dateString)!
}
}
我:
致命错误:在展开可选值
时意外发现nil
当我尝试打印po dateFormatter。date(from: dateString)!"发生崩溃的地方:
致命错误:在展开可选值时意外发现nil错误:警告:无法获得所需的对象指针(替换为NULL):无法加载"self",因为它的值无法求值
错误:Execution was interrupted, reason: EXC_BREAKPOINT (code=1, subcode=0x100c551ec)。进程已返回到表达式求值前的状态。
这只发生在我运行iOS 10.1.1的iPhone 6s上,而不会发生在任何模拟器和运行iOS 9.x.x的设备上
有人知道发生了什么事,以及"无法加载'self',因为它的值无法评估"是什么意思吗?
我用这段代码在一个新项目中尝试了它,我仍然可以重现错误。
即使硬编码月份,没有self部分也会产生相同的错误:
let dateString = "01.NOV.2016 12:00 PM"
构造Date对象的正确方法是:
let calendar = Calendar.current
var components = DateComponents()
components.day = 1
components.month = month
components.year = year
components.hour = 12
components.minute = 00
let date = calendar.date(from: components)!
对于后面的任何人来说,当您只有月份和年份时,构造Date对象的正确方法是:
var components = DateComponents()
components.day = 1
components.month = month
components.year = year
components.hour = 12
components.minute = 00
let date = Calendar.current.date(from: components)
您的代码将在不到两个月的时间内给出完全错误的结果。如果用户的语言环境不是说英语,它就会崩溃。