数组扩展方法中的神秘 "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
}
}
}
这样编译:
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
}
}
}