【问题标题】:Swift using reduce to calculate score from an array of BooleanSwift 使用 reduce 从布尔数组中计算分数
【发布时间】:2019-01-16 15:09:53
【问题描述】:

我有以下代码在操场上运行良好,可以根据输入的布尔值数组计算分数。如果我遵循的是最佳实践,我有点困惑。我正在使用一个名为 score 的变量来获得结果。有没有更好的方法通过避免额外的分数变量来做到这一点?以下是我的代码 sn-p:

var arr = [false, true, true, true]
var score = 0
let sum = arr.reduce(0) { (result, next) -> Int in
if next == true {
    score = score + 1
   }
return score
}

【问题讨论】:

    标签: ios swift reduce


    【解决方案1】:

    你可以试试

    let sum = arr.filter{$0}.count
    

    为了更好的理解可以改写成这样

    let sum = arr.filter{ $0 == true }.count
    

    但是因为

    ($0 == true) = $0

    那么最好有第一种形式

    【讨论】:

    • 你介意告诉我这是如何工作的,因为它从不检查任何条件吗?
    • 过滤器函数将根据 {} 内部的内容过滤数组,并且由于元素是布尔值并且函数期望过滤数组然后它通过,有看这里developer.apple.com/documentation/swift/string/2893557-filter
    • 非常感谢@Sh_Khan。现在我了解了工作原理并得到了精确的解决方案。
    【解决方案2】:

    你应该做一些关于三元运算符和高阶函数的研究。

    试试这个:

    arr.map { $0 == true ? 1 : 0 }.reduce(0, +)
    

    祝你好运!

    【讨论】:

    • $0 == true写成简单的$0
    • 重构是一个趋于无穷的过程。在这种情况下, $0 == true 用于清楚起见。谢谢!
    【解决方案3】:

    您不需要额外的变量 - 使用传入的变量(result,在您的示例中)。只需返回result,或result + 1,取决于next 是否为真。

    let sum = arr.reduce(0) { (result, next) -> Int in
        if next == true {
            return result + 1
        }
        return result
    }
    

    这就是答案,但如果您想让您的代码更简洁,请继续阅读,因为我们可以做得更好。

    您不需要指定块的-> Int 部分。斯威夫特知道。

    let sum = arr.reduce(0) { result, next in
        if next == true {
            return result + 1
        }
        return result
    }
    

    您可以使用三元运算符,而不是 if。在过去,我们称之为“立即如果”。基本上不是这样的:

    if x == 2 {
        return 3
    }
    else {
        return 4
    }
    

    您可以改为:

    return x == 2 ? 3 : 4
    

    回到您的代码,我们可以使用三元运算符将其缩短为:

    let sum = arr.reduce(0) { result, next in
        return next == true ? result + 1 : result
    }
    

    您实际上可以省略== true 部分;对于测试布尔变量,nextnext == true 相同。

    let sum = arr.reduce(0) { result, next in
        return next ? result + 1 : result
    }
    

    现在我们的闭包只剩下一行,我们可以省略return。该语句隐含为返回值。

    let sum = arr.reduce(0) { result, next in
       next ? result + 1 : result
    }
    

    这通常是我停下来的地方,但你可以更进一步。传递给闭包的参数可以通过编号引用:$0 为第一个,$1 为第二个,依此类推。这样,您可以完全省略名称。

    let sum = arr.reduce(0) {
        $1 ? $0 + 1 : $0
    }
    

    现在它已经足够短了,如果你愿意的话,你可以把它放在一行上。

    let sum = arr.reduce(0) { $1 ? $0 + 1 : $0 }
    

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 2016-05-31
      • 2013-05-01
      • 1970-01-01
      • 2019-06-13
      • 2016-08-01
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多