首页 > 解决方案 > Swift 在过滤数组时如何安全地解开可选属性?

问题描述

我正在尝试使用对象类的可选属性过滤对象数组,所以我想知道在不提供默认值的情况下安全地解开该属性的最佳方法是什么。该属性是 Date 类型,因此提供替代值感觉就像是 hack,但我不确定如何做得更好。我知道如何安全地打开带有保护的常规选项,但我不确定在过滤数组时如何使用它。我的代码是这样的:

let completedGoalsThisWeek = goals.filter { $0.returnWeek(date: $0.dateAchieved) == deviceWeek }.count

有问题的属性是 dateAchieved 并且在很多情况下它将为零。

谢谢你。

标签: arraysswiftoptional

解决方案


它没有什么特别之处。就像在任何其他情况下一样打开可选的:

let completedGoalsThisWeek = goals
    .lazy
    .filter { goal -> Bool in
        guard let dateAchieved = goal.dateAchieved else { return false }
        let isCurrentWeek = goal.returnWeek(date: dateAchieved) == deviceWeek
        return isCurrentWeek
    }.count

可以用它Optional.map来缩短它,但我建议不要这样做,它太神秘了:

let completedGoalsThisWeek = goals
    .lazy
    .filter { goal
        goal.dateAchieved.map { goal.returnWeek(date: $0) == deviceWeek } ?? false
    }.count

在任何一种情况下,如果您最终只计算它们并立即丢弃它们,我建议您使用.lazy.filter, 来防止中间分配来保存元素数组。


推荐阅读