代码之家  ›  专栏  ›  技术社区  ›  mfaani

为什么Swift的reduce函数在正确定义了所有类型的情况下抛出一个“表达式类型含糊不清,没有更多上下文”的错误?

  •  0
  • mfaani  · 技术社区  · 6 年前
    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)
    }
    

    对于这三种方法,我得到以下错误:

    表达式类型不明确,没有更多上下文

    documentation

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

    你可以看到 Result Element 可以正确推断。结果明显属于类型 [Int] 元素的类型 [内景] .

    所以我不知道怎么了。我也看到了 here 但这也没用

    1 回复  |  直到 6 年前
        1
  •  0
  •   mfaani    6 年前

    这个错误有误导性 .

    你写的是:

    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 ie公司 Int [5] + [3] ie[内景]

    因此,您必须:

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