Search code examples
swiftfor-in-loop

Writing multiple nested for...in loops in Swift


Is there a tidier or better way to write the below nested for...in loops in Swift please? Or is using for...in even the correct way to populate my cards?

for cardNumber in 1...3 {
    for cardSymbolIdentifier in 1...3 {
        for cardColorIdentifier in 1...3 {
            for cardShadingIdentifier in 1...3 {
                let card = Card(cardNumber: cardNumber, cardSymbolIdentifier: cardSymbolIdentifier, cardColorIdentifier: cardColorIdentifier, cardShadingIdentifier: cardShadingIdentifier)
                deckOfCards.append(card)
            }
        }
    }
}

It definitely does the job, but I can't find anything in the documentation about writing multiple nested loops.

Many thanks in advance, Andy


Solution

  • There is absolutely nothing wrong with your for loops. They are excellent, well-written Swift. The only problem with your code is that it forces deckOfCards to be mutable (var), which may be undesirable. If it is, you could use a map, but I don't consider this particularly better Swift, just slightly different.

    let d = (1...3).flatMap { number in
        (1...3).flatMap { symbol in
            (1...3).flatMap { color in
                (1...3).map { shading in
                    Card.init(cardNumber: number,
                              cardSymbolIdentifier: symbol,
                              cardColorIdentifier: color,
                              cardShadingIdentifier: shading
                    )}}}}
    

    I would probably write it this second way, but only for stylistic reasons. Your for loops are absolutely fine.


    Note @user28434's comment below. My original version of this had a major bug (it returned the wrong type). I've been writing Swift since the day it was released. I teach Swift. I teach functional programming in Swift. And I screwed it up when writing it on the fly. I would never have made that mistake with a simple for loop. There's a major lesson in there.