您不需要额外的变量 - 使用传入的变量(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 部分;对于测试布尔变量,next 与 next == 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 }