> On 23 Mar 2016, at 11:38, Brent Royal-Gordon <[email protected]> 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.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to