How can I do a Swift for-in loop with a step?

Swift

Swift Problem Overview


With the removal of the traditional C-style for-loop in Swift 3.0, how can I do the following?

for (i = 1; i < max; i+=2) {
    // Do something
}

In Python, the for-in control flow statement has an optional step value:

for i in range(1, max, 2):
    # Do something

But the Swift range operator appears to have no equivalent:

for i in 1..<max {
    // Do something
}

Swift Solutions


Solution 1 - Swift

The Swift synonym for a "step" is "stride" - the Strideable protocol in fact, implemented by many common numerical types.

The equivalent of (i = 1; i < max; i+=2) is:

for i in stride(from: 1, to: max, by: 2) {
    // Do something
}

Alternatively, to get the equivalent of i<=max, use the through variant:

for i in stride(from: 1, through: max, by: 2) {
    // Do something
}

Note that stride returns a StrideTo/StrideThrough, which conforms to Sequence, so anything you can do with a sequence, you can do with the result of a call to stride (ie map, forEach, filter, etc). For example:

stride(from: 1, to: max, by: 2).forEach { i in
    // Do something
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam SView Question on Stackoverflow
Solution 1 - SwiftAdam SView Answer on Stackoverflow