2015-09-08 49 views
1

我一直在swift中使用reduce語法。 mapfilter從來沒有讓我起來,但每次都是reduce。以下是我已經試過這一次,他們都不去:Swift的`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: (_, _) -> _)'

如何修復語法?

回答

4

這是一個簡單的運算符優先級問題,由編譯器關於結束簽名的警告模糊處理。

的修復:

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

add運算比三元更高的優先級,使附加首先發生。然後,它試圖評估條件,順序如下:

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

在我看來,這應該可以:

  • 編譯,因爲它返回一個int的列的每次迭代減少
  • 叫喊,因爲它將一個Int添加到Bool中(不會大聲說出減少結束簽名)

......但是,嘿,它既不。對我而言,長期修復是在外部範圍內編寫閉包語句,直到語法被釘住並複製它們爲止。