你如何将 javascript reduce() 翻译成 Swift 2?

How would you translate javascript reduce() to Swift 2?

…假设 js reduce() 接受一个 3 参数函数如下?

var relevance = _(s.words).reduce( function (memo, freq, w) {
    var local = Math.log( 1 + freq );
    var global = Math.log( N / containing(w).length );
    return memo = memo + (local * global);
}, 0);

到目前为止,我得出了:

let relevance = s.words.reduce(0) {
   (memo, freq, w) in

   var local = log( 1 + freq )
   var global = log( N / containing(w).length )

   return memo = memo + (local * global)
} // ~reduce()

但是,由于 arg 的数量不匹配,reduce() 无法编译。

有什么想法吗?

你可以使用reduce函数如下:

[1, 3, 5].reduce(0) { previousValue, arrayValue in
    return previousValue + arrayValue
}

// returns 9

在您的情况下,您可以通过调用枚举来获取值的索引:

// indexValue is of type (index: Int, element: Int)
[1, 3, 5].enumerate().reduce(0) { previousValue, indexValue in
    // access index
    indexValue.index
    // access value
    indexValue.element
    return previousValue + indexValue.element
}

// returns also 9

您的代码:

let relevance = s.words.enumerate().reduce(0) {
   (memo, freqW) in

   let freq = Double(freqW.index)
   let w = freqW.element

   // use let if you don't modify the value
   let local = log( 1 + freq )
   // you probably need to convert some of the variables to Double
   let global = log( N / containing(w).length )

   // in the next iteration memo will be this returned value
   return memo + (local * global)
}