当 dropping/removing 元素时,如何获得 `[Element]` 而不是 `SubSequence`?

How do I get `[Element]` instead of `SubSequence` when dropping/removing elements?

如果我从数组中删除元素并将其存储在这样的变量中:

let lastFive = myArray.suffix(5)

或者这个:

let lastFive = myArray.dropLast(5)

lastFive 将是 Array<SomeType>.SubSequence 而不是元素类型 SomeType。如何让 lastFive 成为 [Element] 而不是 SubSequence

我喜欢使用这个扩展:

extension Sequence {
    func asArray() -> [Element] {
        return Array(self)
    }
}

也就是说,CollectionSequence 协议都定义了一个 sequence() 方法。

Sequence.prefix() returns [Element]Collection.prefix() returns 一个 SubSequence.

给定如下定义的Array,我们可以做一些有趣的事情。

let myArray = [1, 2, 3, 4, 5]

下面的工作是因为编译器知道使用 suffix()Sequence 版本。

func lastFive() -> [Int] {
    return myArray.suffix(5)
}

这里我只是使用上面的扩展。

func lastFive2() -> [Int] {
    return myArray.suffix(5).asArray()
}

以下也有效,因为编译器知道使用 suffix()Sequence 版本。

func lastFive3() -> [Int] {
    let suffix: [Int] = myArray.suffix(5)
    return suffix
}

这不会编译,因为编译器假定您要使用 suffix()Collection 版本。

func doesNotCompile() -> [Int] {
    let suffix = myArray.suffix(5)
    return suffix
}