Swift:在展开可选值时发现映射函数为零
Posted
技术标签:
【中文标题】Swift:在展开可选值时发现映射函数为零【英文标题】:Swift : Map function found nil while unwrapping an Optional value 【发布时间】:2017-10-01 08:59:32 【问题描述】:我正在尝试比较时间,遵循这个link,但它在我身上崩溃了。我实际上有相同的代码,但它总是在dateComponents
行或sorted()
行上崩溃,具体取决于我放置函数的位置。
func setCurrentTime(times: [String])
let formatter = DateFormatter()
formatter.dateFormat = "h: mm a"
let timeMap = times.map
Calendar.current.dateComponents([.hour, .minute], from: formatter.date(from: $0)!)
// Crashes here ...
let upcomingTIme = timeMap.map
Calendar.current.nextDate(after: Date(), matching: $0, matchingPolicy: .nextTime)!
print(upcomingTime) // Returns []
let nextTime = upcomingTIme.sorted().first! // Crashes here too, error line shown below
print(nextTime) // Doesn't get printed...
错误:
[]
fatal error: unexpectedly found nil while unwrapping an Optional value
如果我在函数中传入一个数组或硬编码一个数组,它仍然会崩溃。
【问题讨论】:
日期格式应为“h:mm a” Tthe dateformatter 无法使用您给定的格式解析输入,因此它返回nil
并且因为您强制解包结果,所以您会崩溃。如果您修复格式字符串,它可能会起作用,但使用 flatmap
过滤选项并避免强制展开更具防御性
您能提一下通过的[String]
是什么吗?会更清楚...
【参考方案1】:
您遇到的崩溃是由于传递值的格式和日期格式化程序中使用的格式不同。
formatter.dateFormat = "h: mm a"
虽然您的格式化程序在 'h:' 和 'mm' 之间使用空格,但您可能传递了如下数据。 (没有凌晨 4:30 的 4: 到 30 之间的空格
let times = ["4:30 AM","1:00 PM","3:20 PM","6:40 PM","9:10 PM"]
日期格式化程序不会返回有效日期并且您使用了“!”导致崩溃的运算符。
您可以更改日期格式或根据格式传递数据。这将解决问题,你会得到 p>
这是时间表[小时:4 分钟:30 isLeapMonth:假,小时:13 分钟:0 isLeapMonth:假,小时:15 分钟:20 isLeapMonth:假,小时:18 分钟:40 isLeapMonth:假,小时:21 分钟:10 isLeapMonth: false ]
这是下一个日期2017-10-01 13:10:00 +0000
这是即将到来的日期[2017-10-01 23:00:00 +0000, 2017-10-02 07:30:00 +0000, 2017-10-02 09:50:00 +0000, 2017-10-01 13: 10:00 +0000, 2017-10-01 15:40:00 +0000]
【讨论】:
啊,我注意到了那个愚蠢的错误。但是现在我不能打开它?它显示为Optional(2017-10-02 10:10:00 +0000)
。另外,当数组为["6:10 AM", "1:45 PM", "4:50 PM", "7:02 PM", "8:50 PM", "1:30 PM"]
时,下次我不知道10:10
来自哪里时,它不会显示。
其实,没关系!摆弄代码我终于明白它是如何工作的!谢谢!!以上是关于Swift:在展开可选值时发现映射函数为零的主要内容,如果未能解决你的问题,请参考以下文章
swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称