gpt4 book ai didi

arrays - 当所有类型都正确定义时,为什么 Swift 的 reduce 函数会抛出 'Type of expression ambigious without more context' 错误?

转载 作者:行者123 更新时间:2023-11-30 11:09:25 24 4
gpt4 key购买 nike

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)
}

对于所有三种方法,我都收到以下错误:

Type of expression ambiguous without more context

但是看看documentation和reduce的方法签名:

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

您可以看到ResultElement都可以被正确推断。结果显然是 [Int] 类型,Element 是 [Int] 类型。

所以我不确定出了什么问题。我也看到了 here 但这也没有帮助

最佳答案

你是对的,你传递了要推断的正确类型。 该错误具有误导性

如果你写的是:

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

然后编译器会给出正确错误:

Cannot use mutating member on immutable value: 'array' is a 'let' constant

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

这就是 Result 和 Element 在闭包内都是不可变的。您必须将其视为正常的 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 + 3的类型,即Int[5] + [3],即[内部]

因此你必须这样做:

let sum3 = nums.reduce(emptyArray){ total, element in
var _total = total
_total.append(element)
return _total
}

关于arrays - 当所有类型都正确定义时,为什么 Swift 的 reduce 函数会抛出 'Type of expression ambigious without more context' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com