[swift-evolution] For... else

Andrew Bennett cacoyi at gmail.com
Tue Jan 26 16:30:58 CST 2016


What you described Felix seems to be different to what was proposed, also I
think (as you suggest) that `else` is unclear for what you describe.

To clarify, is what you're suggesting logically equivalent to this?

if let found = [1,2,3,4].find({ $0 == 3 }) {

    print("exited early (\(found))")

}


extension SequenceType {

    func find(

        @noescape each: Generator.Element throws -> Bool

    ) rethrows -> Generator.Element? {

        for element in self {

            if try each(element) == false {

                return element

            }

        }

        return nil

    }

}


If that's correct then I prefer the keyword in the other thread `nobreak`
although it could be a better.

https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001110.html

We'd have to confirm with Lee, but their example (this thread) seems
oriented around zero items rather than early exit:

let items: Int = []


for item in items {

    print(item)

}

else {

    print("No items")

}


My suggestion works for zero items.





On Wed, Jan 27, 2016 at 4:47 AM, Félix Cloutier <felixcca at yahoo.ca> wrote:

> This is more a demonstration that the for...else construct isn't obvious
> than a solution to the problem. In Python, the else branch of a for loop is
> executed when you went through all the iterations without breaking ("when
> the loop condition becomes false", which doesn't happen if you break from
> the loop).
>
> Félix
>
> Le 25 janv. 2016 à 23:14:23, Andrew Bennett via swift-evolution <
> swift-evolution at swift.org> a écrit :
>
> This may do what you want:
>
>     let values: [Int] = [1,2,3,4]
>     if let sequence = nonEmptySequence(values) {
>         for element in sequence {
>             print("element: \(element)")
>         }
>     }
>     else {
>         print("empty!")
>
>     }
>
> It's also more flexible, you can do work after the for loop (that work
> won't execute in the else), you can also use PeekSequence directly to get
> the first value. This is handy for something like an average (reduce) where
> you don't necessarily have a zero value.
>
> The implementation can be found here:
> https://github.com/therealbnut/PeekSequence
>
>
> On Tue, Jan 26, 2016 at 12:59 AM, Matthew Johnson via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>>
>>
>> Sent from my iPad
>>
>> On Jan 25, 2016, at 3:41 AM, Howard Lovatt via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>> It would be easy enough to add:
>>
>>
>>    - func forEach(
>>    -     @noescape elements body: (Element) throws -> Void,
>>    -     @noescape otherwise otherwise: () throws -> Void
>>    - ) rethrows
>>
>>
>> to the standard library or write it yourself.
>>
>>
>> Not unless / until we get the ability for a noescape closure to influence
>> control flow (break, return, etc).  Even then this is clunkier than adding
>> else to the language would be.
>>
>>
>> On 23 Jan 2016, at 12:59 PM, Félix Cloutier via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>> I frequently need something like that and I'd like to have it in Swift
>> too.
>>
>> Félix
>>
>> Le 22 janv. 2016 à 13:22:45, Ben Langmuir via swift-evolution <
>> swift-evolution at swift.org> a écrit :
>>
>> Previous discussion here:
>>
>> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001110.html
>>
>>
>> On Jan 22, 2016, at 8:22 AM, Lee M via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>> This has likely been discussed already, but I haven't been able to find
>> it anywhere.
>> Example:
>>
>>    let items: Int = []
>>
>>    for item in items {
>>        print(item)
>>    }
>>    else {
>>        print("No items")
>>    }
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160127/0b60182e/attachment.html>


More information about the swift-evolution mailing list