2017-06-12 18 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のスウィフト3チェック各日付は、アレイ

ただし、dateFormat.date(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() 
} 

備考:より良いアプローチはStringからDate?にアイテムクラスでdate の種類を変更すること、および初期化中に変換 を行う可能性があります。これにより、今日までの繰り返しの文字列は に保存される可能性があります。

+0

ありがとう、よく説明され、完璧に動作します! :-) –

関連する問題