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

Haravikk swift-evolution at haravikk.me
Wed Mar 23 10:50:30 CDT 2016


> On 23 Mar 2016, at 14:55, Jeremy Pereira via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
>> 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. :-)

Speaking of where, why wouldn’t you just do:

	for eachElement in theIntegerSequence where eachElement < 5 { … }

I think simplified striding is really all we need to cover c-style loop replacement, the only case that can’t be covered is one that uses some kind of variable stride amount, i.e- replacing:

	var step = 0
	for (var i = 0; i < 100; i += step) { step += 1 }

But I think that’s unusual enough that it doesn’t really matter.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160323/62c683ce/attachment.html>


More information about the swift-evolution mailing list