当 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)
}
}
也就是说,Collection
和 Sequence
协议都定义了一个 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
}
如果我从数组中删除元素并将其存储在这样的变量中:
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)
}
}
也就是说,Collection
和 Sequence
协议都定义了一个 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
}