数组扩展方法中的神秘 "extra argument in call" 错误

Mysterious "extra argument in call" error in Array extension method

这样编译:

extension Array {
    func chunked(by chunkSize:Int) -> [[Element]] {
        return stride(from: 0, to: self.count, by: chunkSize).map {
            Array(self[[=11=]..<[[=11=] + chunkSize, self.count].min()!])
        }
    }
}

这不是(用全局 min() 函数代替数组 min() 方法):

extension Array {
    func chunked(by chunkSize:Int) -> [[Element]] {
        return stride(from: 0, to: self.count, by: chunkSize).map {
            Array(self[[=12=]..<min([=12=] + chunkSize, self.count)]) // error
        }
    }
}

编译错误指向 self.count 并表示 "extra argument in call"。

但如果我们不在数组扩展中,则第二个公式很好:

let arr = [1,2,3,4,5,6]
let chunkSize = 2
let chunks = stride(from: 0, to: arr.count, by: chunkSize).map {
    Array(arr[[=13=]..<min([=13=] + chunkSize, arr.count)]) // fine
}

那么,第二个公式中的编译错误实际上是 Swift 编译器错误吗?如果不是,那么第二种表述有什么问题?我知道 "extra argument in call" 通常无法很好地描述来自 Swift 编译器的问题,但是 真正的 问题是什么?为什么在数组扩展中会触发此错误?

编译器将只接受一个参数的 Swift.Array.min(by:) 与您打算使用的全局函数 Swift.min(_:_:) 混为一谈。

通过在全局函数前加上其模块名称 (Swift) 明确限定全局函数解决了问题:

extension Array {
    func chunked(by chunkSize: Int) -> [[Element]] {
        return stride(from: 0, to: self.count, by: chunkSize).map {
            Array(self[[=10=] ..< Swift.min([=10=] + chunkSize, self.count)]) // fixed
        }
    }
}