在Swift中,是否有一种聪明的方法来使用数组上的高阶方法来返回5个第一个对象? obj-c的方法是保存一个索引,而for-loop则通过数组将索引值递增到5,然后返回新的数组。有办法做到这一点与过滤器,映射或减少?
当前回答
let a: [Int] = [0, 0, 1, 1, 2, 2, 3, 3, 4]
let b: [Int] = Array(a.prefix(5))
// result is [0, 0, 1, 1, 2]
其他回答
斯威夫特4
一个不同的解决方案:
一个简单的内联解决方案,不会崩溃,如果你的数组太短
[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 3 ? $0.element : nil }
但是用这个很好。
[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 1000 ? $0.element : nil }
如果你这样做,通常会崩溃:
[0,1,2,3,4,5].prefix(upTo: 1000) // THIS CRASHES
[0,1,2,3,4,5].prefix(1000) // THIS DOESNT
我稍微改变了Markus的答案,将其更新为最新的Swift版本,因为你的方法声明中的var不再被支持:
extension Array {
func takeElements(elementCount: Int) -> Array {
if (elementCount > count) {
return Array(self[0..<count])
}
return Array(self[0..<elementCount])
}
}
Swift 4保存数组类型
extension Array {
func take(_ elementsCount: Int) -> [Element] {
let min = Swift.min(elementsCount, count)
return Array(self[0..<min])
}
}
let a: [Int] = [0, 0, 1, 1, 2, 2, 3, 3, 4]
let b: [Int] = Array(a.prefix(5))
// result is [0, 0, 1, 1, 2]
到目前为止,获得Swift数组的前N个元素的最利落的方法是使用prefix(_ maxLength: Int):
let array = [1, 2, 3, 4, 5, 6, 7]
let slice5 = array.prefix(5) // ArraySlice
let array5 = Array(slice5) // [1, 2, 3, 4, 5]
一句话是:
let first5 = Array(array.prefix(5))
这样做的好处是边界安全。如果传递给prefix的计数大于数组计数,则它只返回整个数组。
注:如评论中所指出,阵列。prefix实际上返回一个ArraySlice,而不是Array。
如果你需要将结果赋值给一个Array类型,或者将它传递给一个期望数组参数的方法,你将需要强制将结果转换为Array类型: