为什么在数组扩展中使用 Stride 创建临时数组是非法的

Dun*_*n C 3 arrays extension-methods stride swift

此代码引发编译器错误:“参数类型‘StrideTo’预计是类或类约束类型的实例”

extension Array {
    func chunks(_ chunkSize: Int) -> [[Element]] {
        let indexes = Array(stride(from: 0, to: count, by: chunkSize)) // This line won't compile
        return [[Element]]()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您在数组扩展之外使用非常相似的代码:

let array = Array(stride(from: 0, to: 20, by: 4))
Run Code Online (Sandbox Code Playgroud)

它给了我我所期望的,一个 array [0, 4, 8, 12, 16]

为什么在数组扩展的函数中创建临时数组是非法的?它是否以某种方式调用stride()数组上的实例方法?如果是这样,有没有办法告诉编译器我想调用全局stride()函数?

Mar*_*n R 5

这是一个错误:SR-13847 扩展中使用了错误的泛型

由于某种原因,当在扩展中调用初始化程序时,编译器会尝试匹配不相关的泛型。

在你的情况下,Array被解释为Array<Element>。作为解决方法,您可以显式指定索引数组的类型:

let indexes = Array<Int>(stride(from: 0, to: count, by: chunkSize))
Run Code Online (Sandbox Code Playgroud)