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 错误致命错误:在展开可选值时意外发现 nil

在展开可选值时发现 nil,附加到数组,Swift 3

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

Swift:致命错误:在展开可选值时意外发现 nil

Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil

Swift,在展开可选值时意外发现 nil (NSKeyedUnarchiver)