编译:
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扩展中会触发此错误?
答案 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
}
}
}