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

Why is creating a temp array with Stride illegal in an Array extension

此代码引发编译器错误:“参数类型 'StrideTo' 应为 class 或 class 约束类型的实例”

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

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

let array = Array(stride(from: 0, to: 20, by: 4))

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

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

这是一个错误:SR-13847 Wrong generic used in extensions:

For some reason when calling initializer in extension, compiler tries to match unrelated generics.

在您的例子中,Array 被解释为 Array<Element>。作为解决方法,您可以明确指定索引数组的类型:

let indexes = Array<Int>(stride(from: 0, to: count, by: chunkSize))