为什么斯威夫特的减少功能扔的“表达ambigious没有更多的上下文的类型”的错误时,所有类型的正确

2019-10-28 17:40发布

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

你可以看到,无论是ResultElement可以被正确地推断。 结果是明显类型的[Int]和元素的类型为[Int]

所以,我不知道什么是错的。 我也看到了这里 ,但是这并没有帮助

Answer 1:

你说得对,你传递正确的类型推断。 该错误是误导性的

有你,而不是写道:

func append<T>(_ element: T, to array: [T]) -> [T]{
    let newArray = array.append(element)
    return newArray
} 

那么编译器会给予正确的错误:

不能在不可变的值使用突变构件:“阵列”是“让”恒定

所以,现在我们知道什么是正确的错误应该是:

这既是结果和元素都是封闭内不可改变。 你必须把它就像一个普通func add(a:Int, b:Int) -> Int ,其中ab都是不可改变的。

如果你想要的工作,你只需要一个临时变量:

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 + 3Int[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?