Most alternatives already where discussed in swift-user:

> Imho the "forEach" solution is flawed, because you can't break the loop, and 
> the "?? []" isn't perfect either:
> I hope the compiler can optimise so that the assembly is as fast as the "if 
> let" solution, but even if this is the case, it is not obvious for a human 
> reader.
> 
> This
> 
> extension Optional where Wrapped: Sequence {
>       var elements: [Wrapped.Iterator.Element] {
>               switch (self) {
>               case .none:
>               return []
>               case .some(let o):
>               return Array(o)
>               }
>       }
> }
> 
> let test: [Int]? = nil
> for i in test.elements {
>       print(i)
> }
> 
> looks nice to me (except the return type — I guess there are better options), 
> but I don't expect that the compiler can do much to optimise it.



But maybe there is something better:

for i in test? {
        print(i)
        if i == 42 {
                break
        }
}

This doesn't work — but it compiles fine when you replace the "?" with "!".

I haven't proposed "in?" earlier because it would be a new keyword (even if its 
not that new…), and I'm very skeptical towards such changes.
But it is a very common pattern in Swift to have a "!" form that may crash and 
a save "?" variant, so I think it is actually missing in the syntax of 
for-loops.

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

Reply via email to