使用Swift的“reduce”语法时出现问题

时间:2015-09-08 14:41:48

标签: swift functional-programming

我在swift中始终遇到reduce语法问题。 mapfilter从不绊倒我,但reduce每次都这样做。这是我这次尝试过的,但没有一个去过:

let count = items.reduce(0) { $0 + $1.selected ? 1 : 0 }
let count = items.reduce(Int(0), combine: { return $0 + $1.selected ? 1 : 0 })
let count = items.reduce(Int(0), combine: { sum, item in return sum + item.selected ? 1 : 0 })

您可以假设每个item都是具有selected布尔属性的对象。这很简单,我觉得我的意图很明确,但编译器没有非常有用的反馈:Cannot invoke 'reduce' with an argument list of type '((Int), combine: (_, _) -> _)'

如何修复语法?

1 个答案:

答案 0 :(得分:4)

这是一个简单的运算符优先级问题,由编译器关于闭包签名的警告进行模糊处理。

修复:

let count = items.reduce(0) { $0 + ($1.selected ? 1 : 0) }

add运算符的优先级高于三元组,因此首先添加。然后它尝试按以下顺序评估条件:

let count = items.reduce(0) { ($0 + $1.selected) ? 1 : 0 }

在我看来,这应该是:

  • 编译,因为它在reduce
  • 的每次迭代中返回一个Int
  • 是的,因为它正在向Bool添加一个Int(不是关于减少闭包签名的喊叫)

......但是嘿,它没有。对我来说,长期修复是在外部作用域中编写闭包语句,直到语法被固定为止,然后将它们复制进去。