【发布时间】:2019-07-26 05:47:20
【问题描述】:
我正在尝试使用对象类的可选属性过滤对象数组,所以我想知道在不提供默认值的情况下安全地解开该属性的最佳方法是什么。该属性是 Date 类型,因此提供替代值感觉就像是 hack,但我不确定如何做得更好。我知道如何安全地打开带有保护的常规选项,但我不确定在过滤数组时如何使用它。我的代码是这样的:
let completedGoalsThisWeek = goals.filter { $0.returnWeek(date: $0.dateAchieved) == deviceWeek }.count
有问题的属性是 dateAchieved,在很多情况下它会为零。
谢谢。
【问题讨论】:
-
为什么
Goal的工作是确定日期在哪一周?这看起来像是一个错位的责任 -
嗯,我想在 Goal 的数组上使用这些方法来过滤它们,所以我想我需要将它们添加到 Goal 类中。你会如何以不同的方式做到这一点?
-
A
Goal恰好有一个日期,但这并不意味着应该将日期操作放入目标中。想象一下,您的系统中有另一种类型,PrereleaseSale。returnWeek(date:)会转到Goal还是PrereleaseSale?两者都有需要知道周数的日期,因此它同样适用。正确的答案是两者都不是,这个函数可能应该作为Date的扩展,或者可能是Calendar。我还会使用计算属性而不是函数,将其称为weekNumber(假设我理解正确,它给出的数字是 0-51 或 1-52) -
这是有道理的,它使语法更加清晰和合乎逻辑,所以感谢您的提示。这确实意味着我必须使用您的答案来过滤数组,即使我不了解闭包(过去尝试过几次,它仍然没有点击)。
-
您在自己的问题中使用了闭包 :) 什么不点击闭包?