神秘的"呼叫中的额外参数"数组扩展方法

时间:2017-03-07 00:56:57

标签: arrays swift3 extension-methods

编译:

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

编译错误指向self.count并在调用&#34;中说出&#34;额外参数。

但如果我们不在数组扩展中,那么第二种表述就可以了:

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

那么,第二个公式中的编译错误实际上是Swift编译器错误吗?如果没有,第二个配方有什么问题?我知道&#34;呼叫中的额外参数&#34;通常是对来自Swift编译器的问题的描述很差,但那么真正的问题是什么?为什么在Array扩展中会触发此错误?

1 个答案:

答案 0 :(得分:1)

编译器将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[$0 ..< Swift.min($0 + chunkSize, self.count)]) // fixed
        }
    }
}