[swift-evolution] `once` keyword for use with loops

Nicholas Maccharoli nmaccharoli at gmail.com
Tue May 17 01:03:50 CDT 2016


​Hello Swift Evolution,

Its not uncommon to have to do a piece of work only once or on the first
iteration of
a loop.
Take for example producing a comma separated string from an Array:

    var result = ""

    let values = [1, 2, 3, 4, 5]

    var gen = values.generate()


    if let first = gen.next() {

        result += "\(first)"

        while let value = gen.next() {

            result += ", "

            result += "\(value)"

        }

    }


Since on the first iteration we want to skip putting a comma in front we
use an `if let` to grab the first element and then embed a `while let`
inside the `if let` to handle the rest.


Another way to do this could be using a bool to keep track of the first
iteration:


    var first = true

    while let value = gen.next() {

        if first {

            result += "\(value)"

            first = false

            continue

        } else {

            result += ", "

            result += "\(value)"

        }

    }


These approaches work, but I think there may be a way to do this with less
noise.

If there was a keyword to execute a block of code only on the first
iteration of a loop I think that would make code like this more concise.

If there was a keyword like `once` then the same thing could be achieved
with something like:


    while let value = gen.next() {

        once {

            result += "\(value)"

            continue

        }

        result += ", "

        result += "\(value)"

    }


How does it sound?


- Nick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160517/6b34033c/attachment.html>


More information about the swift-evolution mailing list