Answers:
到目前为止,获取Swift数组的前N个元素的最简洁的方法是使用prefix(_ maxLength: Int)
:
let someArray = [1, 2, 3, 4, 5, 6, 7]
let first5 = someArray.prefix(5) // 1, 2, 3, 4, 5
这样具有边界安全的好处。如果传递给您的计数prefix
大于数组计数,则它仅返回整个数组。
注意:如注释中所指出的,Array.prefix
实际上返回ArraySlice
,而不是Array
。在大多数情况下,这没有什么区别,但是如果您需要将结果分配给Array
类型或将其传递给期望Array
参数的方法,则需要将结果强制为Array
类型:let first5 = Array(someArray.prefix(5))
dropFirst
and dropLast
,因此也可能具有takeFirst
and takeLast
。
first5
是一个数组,只写let first5 = Array(someArray.prefix(5))
video = video.prefix(5)
的Xcode 7.2 项目中导致编译错误 Cannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
可能仅是Swift 2.x(我不记得它是否在1.x中),但是它肯定存在于所有支持Swift 2.x的OS(iOS 7及更高版本)中。Swift功能的可用性取决于Swift版本,而不是iOS版本。
更新:
现在可以用来prefix
获取数组的前n个元素。检查@mluisbrown的答案以获取有关如何使用前缀的说明。
原始答案:
如果没有filter
,map
或者reduce
仅返回数组范围,您可以非常轻松地完成此操作:
var wholeArray = [1, 2, 3, 4, 5, 6]
var n = 5
var firstFive = wholeArray[0..<n] // 1,2,3,4,5
n
需要Swift数组中的第一个项目,则可以这样做wholeArray.prefix(n)
,它具有边界安全的额外好处。如果n
大于数组大小,则prefix
返回整个数组。
wholeArray
元素数不超过,它将崩溃n
prefix
。
使用Swift 5,可以根据需要选择以下6种Playground代码之一来解决您的问题。
subscript(_:)
下标let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array[..<5]
//let arraySlice = array[0..<5] // also works
//let arraySlice = array[0...4] // also works
//let arraySlice = array[...4] // also works
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
prefix(_:)
方法复杂度:如果集合符合,则为O(1)RandomAccessCollection
;否则为O(k),其中k是要从集合的开头选择的元素数。
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(5)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
苹果声明prefix(_:)
:
如果最大长度超过集合中元素的数量,则结果将包含集合中的所有元素。
prefix(upTo:)
方法复杂度:O(1)
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(upTo: 5)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
苹果声明prefix(upTo:)
:
使用该
prefix(upTo:)
方法等效于使用部分半开范围作为集合的下标。下标表示法优先于prefix(upTo:)
。
prefix(through:)
方法let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(through: 4)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
removeSubrange(_:)
方法复杂度:O(n),其中n是集合的长度。
var array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
array.removeSubrange(5...)
print(array) // prints: ["A", "B", "C", "D", "E"]
dropLast(_:)
方法复杂度:如果集合符合,则为O(1)RandomAccessCollection
;否则为O(k),其中k是要删除的元素数。
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let distance = array.distance(from: 5, to: array.endIndex)
let arraySlice = array.dropLast(distance)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
SWIFT 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
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Swift 4具有保存数组类型
extension Array {
func take(_ elementsCount: Int) -> [Element] {
let min = Swift.min(elementsCount, count)
return Array(self[0..<min])
}
}
快速更新4:
[0,1,2,3,4,5].enumerated().compactMap{ $0 < 10000 ? $1 : nil }
快速3:
[0,1,2,3,4,5].enumerated().flatMap{ $0 < 10000 ? $1 : nil }
对于对象数组,可以从Sequence创建扩展。
extension Sequence {
func limit(_ max: Int) -> [Element] {
return self.enumerated()
.filter { $0.offset < max }
.map { $0.element }
}
}
用法:
struct Apple {}
let apples: [Apple] = [Apple(), Apple(), Apple()]
let limitTwoApples = apples.limit(2)
// limitTwoApples: [Apple(), Apple()]
n
元素Array
。