我正在尝试迭代一个数组并使用泛型来总结所有值,如下所示:
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'
行的 sum = sum + number
和
关于第Int is not convertible to 'U'
行的 return sum
我知道使用reduce方法可以更好地完成这项工作,但是我希望使用迭代完成任务以获得一些练习。为什么会出现这些错误?我从未明确表示T是Int。
答案 0 :(得分: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