var nums = [1,2,3]
let emptyArray : [Int] = []
let sum1 = nums.reduce(emptyArray){ $0.append($1)}
let sum2 = nums.reduce(emptyArray){ total, element in
total.append(element)
}
let sum3 = nums.reduce(emptyArray){ total, element in
return total.append(element)
}
对于这三种方法,我发现了以下错误:
表达含糊的类型没有更多的上下文
但看文档和减少的方法签名:
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
你可以看到,无论是Result
和Element
可以被正确地推断。 结果是明显类型的[Int]
和元素的类型为[Int]
所以,我不知道什么是错的。 我也看到了这里 ,但是这并没有帮助
你说得对,你传递正确的类型推断。 该错误是误导性的 。
有你,而不是写道:
func append<T>(_ element: T, to array: [T]) -> [T]{
let newArray = array.append(element)
return newArray
}
那么编译器会给予正确的错误:
不能在不可变的值使用突变构件:“阵列”是“让”恒定
所以,现在我们知道什么是正确的错误应该是:
这既是结果和元素都是封闭内不可改变。 你必须把它就像一个普通func add(a:Int, b:Int) -> Int
,其中a
和b
都是不可改变的。
如果你想要的工作,你只需要一个临时变量:
let sum1 = nums.reduce(emptyArray){
let temp = $0
temp.append($1)
return temp
}
还要注意的是,以下是是错误的!
let sum3 = nums.reduce(emptyArray){ total, element in
var _total = total
return _total.append(element)
}
为什么?
因为类型_total.append(element)
是Void
它是一个函数。 其类型是不喜欢的类型5 + 3
即Int
或[5] + [3]
,即[INT]
因此,你需要做的:
let sum3 = nums.reduce(emptyArray){ total, element in
var _total = total
_total.append(element)
return _total
}
文章来源: Why does Swift's reduce function throw an error of 'Type of expression ambigious without more context' when all types are properly defined?