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