Mysterious “extra argument in call” error in Array extension method [duplicate]

梦想的初衷 提交于 2019-12-04 06:52:20

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!