在Swift中一次迭代收集两个

fum*_*007 6 swift

说我有一个阵列[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)


mat*_*att 6

这与要求的不同,但我在 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]],现在你可以迭代它,如果你愿意。


Man*_*dan 6

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)


Mar*_*n R 5

您可以使用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)

做这项工作。