说我有一个阵列[1, 2, 3, 4, 5].我怎样才能一次迭代两个?
Iteration 1: (1, 2)
Iteration 2: (3, 4)
Iteration 3: (5, nil)
Run Code Online (Sandbox Code Playgroud)
Leo*_*bus 20
您可以使用名为stride(to:,by :)的渐进循环来迭代每n个元素的元素:
Xcode 8.3.2•Swift 3.1
let array = Array(1...5)
let pairs = stride(from: 0, to: array.endIndex, by: 2).map {
(array[$0], $0 < array.index(before: array.endIndex) ? array[$0.advanced(by: 1)] : nil)
} // [(.0 1, {some 2}), (.0 3, {some 4}), (.0 5, nil)]
print(pairs) // "[(1, Optional(2)), (3, Optional(4)), (5, nil)]\n"
Run Code Online (Sandbox Code Playgroud)
这与要求的不同,但我在 Sequence 上使用了一个扩展,它生成一个数组数组,将原始序列按任何所需的大小分块:
extension Sequence {
func clump(by clumpsize:Int) -> [[Element]] {
let slices : [[Element]] = self.reduce(into:[]) {
memo, cur in
if memo.count == 0 {
return memo.append([cur])
}
if memo.last!.count < clumpsize {
memo.append(memo.removeLast() + [cur])
} else {
memo.append([cur])
}
}
return slices
}
}
Run Code Online (Sandbox Code Playgroud)
所以[1, 2, 3, 4, 5].clump(by:2)产量[[1, 2], [3, 4], [5]],现在你可以迭代它,如果你愿意。
Extension to split the array.
extension Array {
func chunked(into size: Int) -> [[Element]] {
return stride(from: 0, to: count, by: size).map {
Array(self[$0 ..< Swift.min($0 + size, count)]) }
}
}
let result = [1...10].chunked(into: 2)
Run Code Online (Sandbox Code Playgroud)
您可以使用sequence()和 迭代器的next()方法来迭代成对的连续元素。这适用于任意序列,不仅适用于数组:
let a = "ABCDE"
for pair in sequence(state: a.makeIterator(), next: { it in
it.next().map { ($0, it.next()) }
}) {
print(pair)
}
Run Code Online (Sandbox Code Playgroud)
输出:
(“A”,可选(“B”)) (“C”,可选(“D”)) (“E”,无)
“外部”it.next()产生偶数位置的元素,或者nil
(在这种情况下也it.next().map { }计算nil为,并且序列终止)。“内部”it.next()产生奇数位置或 的元素nil。
作为任意序列的扩展方法:
extension Sequence {
func pairs() -> AnyIterator<(Element, Element?)> {
return AnyIterator(sequence(state: makeIterator(), next: { it in
it.next().map { ($0, it.next()) }
}))
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
let seq = (1...).prefix(5)
for pair in seq.pairs() { print(pair) }
Run Code Online (Sandbox Code Playgroud)
请注意,这些对是惰性生成的,没有创建中间数组。如果你想要一个包含所有对的数组,那么
let pairs = Array([1, 2, 3, 4, 5].pairs())
print(pairs) // [(1, Optional(2)), (3, Optional(4)), (5, nil)]
Run Code Online (Sandbox Code Playgroud)
做这项工作。
| 归档时间: |
|
| 查看次数: |
4915 次 |
| 最近记录: |