【问题标题】:iOS Swift 3 Check each date is valid, before filtering arrayiOS Swift 3 在过滤数组之前检查每个日期是否有效
【发布时间】:2017-06-12 11:04:03
【问题描述】:
let dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss"

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

我有上面的代码来过滤我的数组中大于或等于今天日期的项目,这工作正常。

但是,我想检查 dateFormat.date(from: item.date)!有效,好像日期无法解析或格式不正确,我的应用程序崩溃了。

我知道可选选项,如下所示,但我不确定它们是否适合。比如……

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

任何帮助将不胜感激?谢谢。

【问题讨论】:

    标签: arrays swift filter optional


    【解决方案1】:

    你在正确的轨道上,但你只需要条件 绑定,而不是 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?,然后进行转换 在初始化期间。这可能会保存重复的字符串 转化率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2017-02-28
      • 2016-04-15
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多