[swift-evolution] A (better) Swift Equivalent For The Classical For-Loop With Numeric Scalars

Jeremy Pereira jeremy.j.pereira at googlemail.com
Wed Mar 23 09:55:45 CDT 2016


> On 23 Mar 2016, at 11:38, Brent Royal-Gordon <brent at architechies.com> wrote:
> 
>> One advantage of the old C style for loop is that everything to do with loop control is in one place, usually on one line. There is currently no way of doing that for the (quite common) use case of iterating through a sequence until a particular condition (other than the end of the sequence) is true except by using a break. 
> 
> If you can stand using method chains, I believe that role would be filled by the `takeWhile(_:)` method that Kevin Ballard (IIRC) wants to add to Sequence. (Although `takeWhile(_:)` would be greedy by default.)

After writing the last email, I tried adding a method to SequenceType called whileTrue(_:) that did pretty much the same thing. It wrapped a Generator in another custom Generator that ended when the supplied closure returned true and it worked fine. However, the closure had no visibility of the iterator so

    for i in someIntegerSequence.whileTrue({ i < 5 }) { … } 

was understandably a compiler error. 

> 
> But honestly, other than distaste, I don't see much of a practical issue with putting an `if` or `guard` on the first line with a `break` in it. That still clusters the iteration logic at the top of the loop, even if it's not quite in a single statement.

True, but we could have argued the same about the `where` keyword and that is in existence. :-)


Having said all that, when I converted a Swift 2.1 project with 10s of thousands of lines of code to 2.2, I found only two C style for loops, one of which could have used the iterator syntax and the other I converted to a while loop. The conversion effort was less than it took to write this email.


More information about the swift-evolution mailing list