在Swift中有没有更简洁的方法来获取数组的最后两个元素?一般来说,我尽量避免这种方法,因为它很容易与索引偏离一。(本例使用Swift 1.2)
// Swift -- slices are kind of a hassle?
let oneArray = ["uno"]
let twoArray = ["uno", "dos"]
let threeArray = ["uno", "dos", "tres"]
func getLastTwo(array: [String]) -> [String] {
if array.count <= 1 {
return array
} else {
let slice: ArraySlice<String> = array[array.endIndex-2..<array.endIndex]
var lastTwo: Array<String> = Array(slice)
return lastTwo
}
}
getLastTwo(oneArray) // ["uno"]
getLastTwo(twoArray) // ["uno", "dos"]
getLastTwo(threeArray) // ["dos", "tres"]
我希望有一个更接近Python的便利性的东西。
## Python -- very convenient slices
myList = ["uno", "dos", "tres"]
print myList[-2:] # ["dos", "tres"]
9条答案
按热度按时间jaql4c8m1#
使用Swift 5,根据您的需要,您可以选择以下模式之一,以便从数组的最后两个元素中获取新数组。
#1.使用Array的
suffix(_:)
在Swift中,符合
Collection
协议的对象有一个suffix(_:)
方法。Array的suffix(_:)
有以下声明:返回一个子序列,最大长度为给定的最大长度,其中包含集合的最后一个元素。
#2.使用
Array
的subscript(_:)
作为
suffix(_:)
方法的替代,您可以使用Array
的subscript(_:)
下标:shstlldc2#
myList[-2:]
是的,我有一个增强请求,要求负索引符号,我建议你也提交一个。
然而,你不应该让自己更难做到这一点。内置的全局
suffix
函数正是你想要的:结果是一个切片,但如果需要,您可以将其强制转换为Array。
zujrkrfu3#
在swift 5中,可以使用suffix从最后一个获取对象,使用prefix从第一个获取对象,下面是一个例子:
结果是一个切片,但如果需要,您可以将其强制转换为Array。
aurhwmvo4#
在Swift 2中,你可以扩展
CollectionType
。下面是一个例子(借用Rob纳皮耶的答案):您可以在任何
CollectionType
上使用它。下面是Array
:下面是
CharacterView
:(Note我的示例在所有情况下都返回Array,而不是原始集合类型。
hvvq6cgz5#
更一般的答案…
8qgya5xd6#
Swift中数组的最后两项
EDIT:首先检查myArray.count〉= 2
这里它被 Package 在一个函数中,该函数接受数组并返回一个包含最后两个元素的数组,或者如果传递的数组不包含至少两个元素,则返回nil。
wbrvyc0a7#
zwghvu4y8#
我怀疑它会让你更快乐,但数学肯定更简单:
请注意,
reverse()
是惰性的,所以这不是特别昂贵。busg9geu9#
Swift4解决方案:
其他解释Swift内置函数
func suffix(from start: Int) -> ArraySlice<Element>
功能的例子有...