...or how can I use the index inside the for loop condition
Hey people Since we're left with no c style for loops in swift 3 I can't seem to find a way to express a bit more complex for loops so maybe you can help me out.
If I were to write this
for(int i=5; num/i > 0; i*=5)
in swift 3 how would I do that?
The closes I came by was:
for i in stride(from: 5, through: num, by: 5) where num/i > 0
but this will of course iterate 5 chunks at a time instead if i being: 5, 25, 125 etc.
Any ideas?
Thanks
Using a helper function (originally defined at Converting a C-style for loop that uses division for the step to Swift 3)
you can write the loop as
A simpler solution would be a while-loop:
but the advantage of the first solution is that the scope of the loop variable is limited to the loop body, and that the loop variable is a constant.
Swift 3.1 will provide a
prefix(while:)
method for sequences, and then the helper function is no longer necessary:All of above solutions are "equivalent" to the given C loop. However, they all can crash if
num
is close toInt.max
and$0 * 5
overflows. If that is an issue then you have to check if$0 * 5
fits in the integer range before doing the multiplication.Actually that makes the loop simpler – at least if we assume that
num >= 5
so that the loop is executed at least once:For completeness: an alternative to the
while
loop approach is using anAnyIterator
:This method suffers from the same drawback as the
while
loop in that the loop "external"i
variable persists outside and after the scope of the loop block. This externali
variable is not, however, thei
variable that is accessible within the loop body, as we let the loop body variablei
shadow the external one, limiting access toi
within the body to the immutable, temporary (loop scope local) one.