为什么在数组扩展中使用 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))
此代码引发编译器错误:“参数类型 '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))