【发布时间】:2017-03-07 00:56:57
【问题描述】:
这样编译:
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 并显示“调用中的额外参数”。
但是如果我们不在一个数组扩展中,第二个公式就可以了:
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 编译器错误吗?如果不是,那么第二种表述有什么问题?我知道“调用中的额外参数”通常不能很好地描述来自 Swift 编译器的问题,但是 真正的 问题是什么?为什么在 Array 扩展中会触发此错误?
【问题讨论】:
-
对于the problem described here 来说这是一个糟糕的错误——尽管在 Swift 3.1 中,诊断大大改进为“使用'min'是指实例方法'min (by:)' 而不是模块 'Swift' 中的全局函数 'min'"
-
@Hamish 你的评论让我看到了一些我以前从未见过的 SO 界面,提供让我自我标记这个作为副本。酷。
标签: arrays swift3 extension-methods