当我们尝试从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)
}
是否可以执行此转换?
答案 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)
}