> 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