将RandomAccessSlice转换为RandomAccessCollection

时间:2017-09-15 06:49:06

标签: arrays swift

当我们尝试从Array检索一系列元素时,我们会返回ArraySlice

let array = [1, 3, 5, 2]
let arraySlice = array[..<2] // elements up to index 1 == [1, 3]

我们可以将其转换回Array类型,如下所示:

let arrayFromSlice = Array(arraySlice)

假设您要创建一个返回任意RandomAccessCollection的前3个元素的方法:

func first3Elements<T: RandomAccessCollection>(_ c: T) -> T {
  let slice = c.prefix(3)

  // COMPILER ERROR: non-nominal type 'T' 
  // does not support explicit initialization
  return T(slice)
}

是否可以执行此转换?

1 个答案:

答案 0 :(得分:1)

这是我第一次尝试使用类型擦除,但我想有更好的解决方案。

func first3Elements<T>(_ c: AnyRandomAccessCollection<T>) -> AnyRandomAccessCollection<T> {
    let slice = c.prefix(3)
    return AnyRandomAccessCollection(slice)
}

let array = AnyRandomAccessCollection([1, 2, 3, 4])
let result = first3Elements(array)

for x in result {
    print(x)
}