arrays - Swift 在过滤数组时如何安全地解开可选属性?
问题描述
我正在尝试使用对象类的可选属性过滤对象数组,所以我想知道在不提供默认值的情况下安全地解开该属性的最佳方法是什么。该属性是 Date 类型,因此提供替代值感觉就像是 hack,但我不确定如何做得更好。我知道如何安全地打开带有保护的常规选项,但我不确定在过滤数组时如何使用它。我的代码是这样的:
let completedGoalsThisWeek = goals.filter { $0.returnWeek(date: $0.dateAchieved) == deviceWeek }.count
有问题的属性是 dateAchieved 并且在很多情况下它将为零。
谢谢你。
解决方案
它没有什么特别之处。就像在任何其他情况下一样打开可选的:
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
, 来防止中间分配来保存元素数组。
推荐阅读
- node.js - cassandra-driver 映射器对象中的问题
- common-lisp - 在编译和加载后使 REPL 最终出现在给定的包中(Common Lisp)
- java - 使用 java 从 API 回复中删除秒数
- php - 为什么我在 Laravel Blade 中找不到我的数据
- angular7 - 如何修改 - 使用 pipe() 可观察的 rxjs 中后端的数据?
- python - Python - 更新 SQL 数据库成功,但数据库中没有更新
- python - 如何在 Django 查询参数中使用复选框选择的值?
- sql - SQL 查询到 Rails 查询(Case Statement)
- botframework - Azure WebBot-Cortana OAUTH 问题“发布到 'https://CortanaBFChannelWestUS.azurewebsites.net
- ios - UITableViewCell 上的动画