2017-06-12 49 views
1
let dateFormat = DateFormatter() 
dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss" 

filtereditems = items.filter { item in return dateFormat.date(from: item.date)! >= Date()} 

我有上面的代碼來過濾我的數組中的項目,它們大於或等於今天的日期,這很好。iOS Swift 3檢查每個日期是否有效,然後過濾數組

但是,我想檢查dateFormat.date(from:item.date)!如果日期無法解析或格式不正確,我的應用崩潰了。

我知道可選項,如下所示,但我不確定它們是否合在一起。例如......

if let temp_date = dateFormat.date(from: item.date) as? Date { 
    //valid 
} else { 
    //invalid 
} 

任何幫助將不勝感激?謝謝。

回答

3

你是在正確的軌道上,但你只需要條件 結合,而不是有條件的投用as? Data

let filtereditems = items.filter { item in 
    if let temp_date = dateFormat.date(from: item.date) { 
     // valid date string: compare with current date 
     return temp_date >= Date() 
    } else { 
     // invalid date string: skip 
     return false 
    } 
} 

或者 - 如果你喜歡 - 與guard

let filtereditems = items.filter { item in 
    guard let temp_date = dateFormat.date(from: item.date) else { 
     // invalid date string: skip 
     return false 
    } 
    // valid date string: compare with current date 
    return temp_date >= Date() 
} 

或者,使用nil-coalescing運算符??將 無效字符串映射到過去的日期:

let filtereditems = items.filter { item in 
    return dateFormat.date(from: item.date) ?? Date.distantPast >= Date() 
} 

或參數快捷鍵:

let filtereditems = items.filter { 
    dateFormat.date(from: $0.date) ?? Date.distantPast >= Date() 
} 

注:一個更好的辦法可能是在你的物品類別改變date 類型從StringDate?,並在初始化過程中進行轉換 。這可以節省重複的字符串到目前爲止 轉換。

+0

謝謝,很好的解釋和完美的作品! :-) –