Swift:通过可选 属性 将可选的模型数组减少为单个 Bool

Swift: Reduce optional array of models to single Bool by optional property

我刚刚在 swift 中了解了 map、flatMap 和 reduce 的美妙世界,我已经在任何有意义的地方使用它并帮助改进我的代码。

现在我遇到了一个非常特殊的问题,我想知道是否有使用 map、flatMap 解决这个问题的方法 and/or reduce。

在我的模型 class 中,我有一个可选的其他模型数组。这些模型有一个可选的 Bool 属性。我现在想知道整个模型数组是否至少包含一个具有真实 属性 的模型。这就是我目前正在做的事情:

class ModelA{
  var bModels: [ModelB]?
}
class ModelB{
  var aBool: Bool?
}

func hasATrue(aModel: ModelA) {
    guard let bModels = aModel.bModels else { return false }
    for bModel in bModels {
        if bModel.aBool == true {
            return true
        }
    }
    return false
}

您可以使用可选链接、Array.contains(where:) 和零合并在单个表达式中完成所有这些操作。

func hasATrue(aModel: ModelA) {
    return aModel.bModels?.contains(where: { [=10=].aBool == true }) ?? false
}

根据对我的问题的评论,这就是解决问题的方法:

return aModel.bModels?.contains(where: { [=10=].aBool == true }) ?? false

或者

return aModel.bModels?.contains(where: { [=11=].aBool == true }) == true

一个比另一个好吗?我不知道。也许对语言的实现方式有深入了解的 Swift 专家可以分辨出哪个 faster/more 有效,但对我来说,该方法很少被调用,因此处理时间不是问题,但这是另一个话题.

感谢所有评论者。我对 map、flatMap 和 reduce 如此着迷,以至于我没有看到明显的东西(我也不知道你可以将闭包传递给 swift 中的 contains 函数)。一天比一天,我越来越喜欢这门语言。

每次要为Android编写Java代码时,我都快哭了