I’m against removing “where" from “for/in”. I use it in my code and I think it 
aids readability quite a bit. In the example:

for x in theArray where x % 2 == 1 { print (x) }
I think it’s artificially confusing because the print is on the same line. If 
we break the line we see the “where” at the end of the line and it reads like 
the English I would use to tell someone what this loop is doing:

for x in theArray where x % 2 == 1 {
... 
To me this reads very clearly: I’m looping through some values BUT I want to 
skip some, now here’s what I’m going to do with these values. Using “guard” for 
this purpose adds unnecessary lines of code and also allows for the (common in 
my experience!) bug of accidentally using “break” or “return” inside the guard 
instead of “continue”. Also, guard / continue just doesn’t read like a filter.

Having the filtering/where logic (eg: what I’m _iterating_ over) separated from 
the body of the loop (eg: what i’m _doing_ to those objects) is one of my 
favorite things about Swift.

Yes, we could also do that with “filter” followed by “forEach”, but then it 
would read totally backwards and I don’t always want that. (I mean, at this 
point “for/in blah” could be considered syntactic sugar for "blah.forEach {}” 
but I still want "for/in".)


for x in theArray where x % 2 == 1 { print (x) }
while let x = anArray.popLast() where x % 2 == 1 { print(x) }
In this example case the “while” is only unclear to me because Swift has the 
odd thing where it does pattern matching using “let” as well as using let in a 
plain old assignment, and it’s hard to know which is which. I could argue that 
it’s also unclear why I can’t type “let x = anArray popLast where x % 2 == 1” 
by itself on a line and have x be an optional. (I would have liked it if we 
used “match” as a keyword instead of “let” when we’re doing patterns, but there 
you go.)

-Wil
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to