This question already has an answer here:
This compiles:
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()!])
}
}
}
This doesn't (substituting the global min()
function for the array min()
method):
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
}
}
}
The compile error points to self.count
and says "extra argument in call".
But if we're not in an Array extension, the second formulation is fine:
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
}
So, is the compile error in the second formulation actually a Swift compiler bug? If not, what's wrong with the second formulation? I'm aware that "extra argument in call" is often a poor description of the problem coming from the Swift compiler, but then what's the real problem? Why does being inside an Array extension trigger this error?
The compiler is conflating Swift.Array.min(by:)
, which only takes a single argument, with the global function Swift.min(_:_:)
that you're intending to use.
Explicitly qualifying the global function by prefixing it with its module name (Swift
) resolves the issue:
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
}
}
}
来源:https://stackoverflow.com/questions/42638329/mysterious-extra-argument-in-call-error-in-array-extension-method