在 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
请问在 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