"含糊的下标"当试图返回一个数组

时间:2018-02-12 04:35:13

标签: arrays swift

我希望在Swift 4中提取子数组并遇到意想不到的困难。

以下微不足道的案例按预期工作:

let array1 = ["a", "b", "c","x","y","z"]
array1[2...3]  // returns ["c","x"], as it should

以下变体:

let m=2
let n=3
array1[m...n]  // returns ["c","x"], as it should

但如果我尝试围绕此创建一个函数,我会收到一条错误消息ambiguous subscript with base type 'Array<Any>' and index type 'CountableClosedRange<Int>'

func arrayTake(arrayIn: Array<Any>) -> Array<Any> {
    return arrayIn[2...3]
}     // no good

当然,以下形式更接近我实际想做的事情,但失败并显示相同的错误消息:

func arrayTake(m: Int, n: Int, arrayIn: Array<Any>) -> Array<Any> {
    return arrayIn[m...n]
}     // no good

我在这里看到了关于模糊下标的其他问题,但是无法将答案翻译成我问题的解决方案。任何指导都将不胜感激。

2 个答案:

答案 0 :(得分:6)

您收到此错误是因为您尝试返回的是ArraySlice而不是预期的Array<Any>

  

切片是视图到数组

因此您可能希望使用专用的数组构造函数转换此切片:

func arrayTake(m: Int, n: Int, arrayIn: Array<Any>) -> Array<Any> {
    return Array(arrayIn[m...n])
}

此外,请注意不鼓励ArraySlice的长期存储,即使在原始数组的生命周期结束后,切片也会保留对较大数组的整个存储的引用,而不仅仅是它所呈现的部分。 。因此,长期存储切片可能会延长不再可访问的元素的生命周期,这可能会导致内存和对象泄漏。

答案 1 :(得分:2)

问题是数据类型不匹配。

array1[2...3]此语句不返回Array,它返回ArraySlice这种数组操作的特殊DataType(struct)。

所以你可以通过两种方式解决这个问题。

将返回类型更改为ArraySlice

func arrayTake(m: Int, n: Int, arrayIn: Array<Any>) -> ArraySlice<Any> 
{   
    return arrayIn[m...n] 
}

OR

将ArraySlice转换为数组

func arrayTake(m: Int, n: Int, arrayIn: Array<Any>) -> Array<Any> {  
    return Array(arrayIn[m...n])    
}

两者都会打印相同的输出,但请记住它们不相同:

let array1 = ["a", "b", "c","x","y","z"]
let result = arrayTake(m: 2, n: 3, arrayIn: array1)

print(result) //["c","x"], as it should

查看此内容以获取更多详细信息:https://medium.com/@marcosantadev/arrayslice-in-swift-4e18522ab4e4