2017-10-01 52 views
0

我試圖比較時間,以下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... 
} 

ERROR:

[] 
fatal error: unexpectedly found nil while unwrapping an Optional value 

如果我通過在陣列或硬編碼在它仍然崩潰的功能的陣列。

+0

日期格式應該是「h:mm a」 – vacawama

+0

dateformatter無法用輸入格式解析輸入,所以它返回'nil',並且因爲你有力量解開結果,你會崩潰。如果你修正你的格式字符串,它可能會工作,但更防禦性地使用'flatmap'來過濾可選項並且避免強制解包 – Paulw11

+0

你能提一下傳入的'[String]'是什麼?這會更清楚...... –

回答

0

您得到的崩潰是由於日期格式化程序中傳遞的值和格式的格式不同所致。

formatter.dateFormat = "h: mm a" 

當你格式化使用之間的空間「H:」「毫米」,你可能如下傳遞的數據。 (不含4之間的空間:在上午4:30

let times = ["4:30 AM","1:00 PM","3:20 PM","6:40 PM","9:10 PM"] 

日期格式和30不會返回有效日期和您使用運營商這導致崩潰

要麼你可以改變「!」。日期格式或數據傳遞根據格式,這將解決這個問題,你會得到

  • 這是timemap

[小時:4分鐘:30 isLeapMonth:假,小時:13分鐘:0 isLeapMonth:假,小時:15分鐘:20 isLeapMonth:假,小時:18分鐘:40 isLeapMonth:假,小時:21分鐘:10 isLeapMonth :假]

  • 這是一個日期

2017年10月1日13點10分零零秒+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]

+0

啊,我注意到那個愚蠢的錯誤。但現在我無法解開它?它出現爲'可選(2017-10-02 10:10:00 +0000)'。另外,它不會顯示下一次我不知道'10:10'是從何時發出'[「6:10 AM」,「1:45 PM」,「4:50 PM 「,」下午7點02分「,」下午8點50分「,」下午1點30分「]' –

+0

注意,不要介意!擺弄這些代碼,我終於明白它是如何工作的!謝謝!! –

+0

好極了。提前學習。 – manismku

相關問題