问题
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?
回答1:
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