Iterate over collection two at a time in Swift

前端 未结 7 960
花落未央
花落未央 2020-11-28 16:00

Say I have an array [1, 2, 3, 4, 5]. How can I iterate two at a time?

Iteration 1: (1, 2)
Iteration 2: (3, 4)
Iteration 3: (5, nil)
7条回答
  •  心在旅途
    2020-11-28 16:17

    You can use a progression loop called stride(to:, by:) to iterate over your elements every n elements:

    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"
    

    To iterate your collection subsequences instead of tuples:

    extension Collection {
        func unfoldSubSequences(limitedTo maxLength: Int) -> UnfoldSequence {
            sequence(state: startIndex) { start in
                guard start < self.endIndex else { return nil }
                let end = self.index(start, offsetBy: maxLength, limitedBy: self.endIndex) ?? self.endIndex
                defer { start = end }
                return self[start..

    let array = Array(1...5)
    for subsequence in array.unfoldSubSequences(limitedTo: 2) {
        print(subsequence)  // [1, 2] [3, 4] [5]
    }
    

    This would work on any kind of collection:

    let string = "12345"
    for substring in string.unfoldSubSequences(limitedTo: 2) {
        print(substring)  // "12" "34" "5"
    }
    

提交回复
热议问题