我在swift中始终遇到reduce
语法问题。 map
和filter
从不绊倒我,但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: (_, _) -> _)'
如何修复语法?
答案 0 :(得分:4)
这是一个简单的运算符优先级问题,由编译器关于闭包签名的警告进行模糊处理。
修复:
let count = items.reduce(0) { $0 + ($1.selected ? 1 : 0) }
add运算符的优先级高于三元组,因此首先添加。然后它尝试按以下顺序评估条件:
let count = items.reduce(0) { ($0 + $1.selected) ? 1 : 0 }
在我看来,这应该是:
......但是嘿,它没有。对我来说,长期修复是在外部作用域中编写闭包语句,直到语法被固定为止,然后将它们复制进去。