在 Swift 中编写多个嵌套的 for...in 循环

Writing multiple nested for...in loops in Swift

请问在 Swift 中是否有更简洁或更好的方法来编写下面的嵌套 for...in 循环?还是使用 for...in 填充我的卡片的正确方法?

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)
            }
        }
    }
}

确实可以,但我在文档中找不到任何关于编写多个嵌套循环的内容。

非常感谢, 安迪

您的代码根据需要完全没有优化问题,但您可以使其更优雅或更快捷 (:p)

let values = [1,2,3]

values.forEach { (cardNumber) in
    values.forEach { (cardSymbolIdentifier) in
        values.forEach { (cardColorIdentifier) in
            values.forEach { (cardShadingIdentifier) in

                let card = Card(cardNumber: cardNumber, cardSymbolIdentifier: cardSymbolIdentifier, cardColorIdentifier: cardColorIdentifier, cardShadingIdentifier: cardShadingIdentifier)
                deckOfCards.append(card)
            }
        }
    }
}   

你的 for 循环绝对没有问题。它们非常出色,写得很好 Swift。您的代码的唯一问题是它强制 deckOfCards 可变 (var),这 可能 是不可取的。如果是,您可以使用 map,但我认为这不是特别好 Swift,只是略有不同。

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
                )}}}}

可能用第二种方式写,但只是出于文体原因。你的 for 循环绝对没问题。


注意@user28434 下面的评论。我的 original version 这个有一个主要错误(它返回了错误的类型)。自发布之日起,我就一直在写 Swift。我教Swift。我在 Swift 教 函数式编程 。我在写的时候把它搞砸了。我永远不会用一个简单的 for 循环犯那个错误。里面有重要的一课。

如果你在一个循环中这样做,那么它在算术上变得复杂

for i in 0..<81 {
    deckOfCards.append(
        Card(cardNumber: i / 27, cardSymbolIdentifier: i/9 % 3, 
             cardColorIdentifier: i/3 % 3, cardShadingIdentifier: i % 3)
    )
}

let deckOfCards = (0..<81).map {

    Card(cardNumber: [=11=] / 27, cardSymbolIdentifier: [=11=]/9 % 3, 
         cardColorIdentifier: [=11=]/3 % 3, cardShadingIdentifier: [=11=] % 3)
}

在这两个示例中 - 索引都从 0 开始,因此您的 class 初始化函数应该 稍微移动索引

在每个参数中添加+1 before/after passing