2015-04-22 40 views
5

我想通過數組迭代,並總結使用泛型像這樣的所有值相加使用循環數組:問題在迅速

func reduceDaArray <T, U>(a: [T], startingValue: U, summed: (U, T) -> U) -> U { 

    var sum = 0 

    for number in a { 
     sum = sum + number 
    } 

    return sum 
} 

reduceDaArray([2,3,4,5,6], 2, +) //(22) 

它給我以下錯誤:

Binary operator '+' cannot be applied to operands of type 'Int' and 'A'至於行與問候行

我知道使用reduce方法可以更好地完成此任務,但是我希望使用迭代爲此實例完成任務以獲得一些練習。爲什麼會出現這些錯誤?我從來沒有明確表示T是一個Int。

回答

3

在你reduceDaArray()功能,

var sum = 0 

聲明一個整數,而不是使用給定startingValue。 而

sum = sum + number 

嘗試一個通用的數組元素添加,而不是使用 給定summed閉合到整數。

所以你可能指的是

func reduceDaArray <T, U>(a: [T], startingValue: U, summed: (U, T) -> U) -> U { 

    var sum = startingValue 
    for number in a { 
     sum = summed(sum, number) 
    } 
    return sum 
} 

來編譯和按預期工作:

let x = reduceDaArray([2, 3, 4, 5, 6], 2, +) 
println(x) // 22 
let y = reduceDaArray([1.1, 2.2], 3.3, *) 
println(y) // 7.986 
let z = reduceDaArray(["bar", "baz"], "foo") { $0 + "-" + $1 } 
println(z) // foo-bar-baz