我是从Swift开始的,现在我已经坚持了这个问题了一段时间 . 我正在尝试通过一系列卡片并将它们添加到一个字典下的一个字典下,该键代表它们被播放的转弯 .
我做了一个字典turnsWithCardsPlayed应该包含一个键:这样的值对 - "Turn 2":[Card1,Card2,Card3] . 问题是如果密钥没有与之关联的值,它不会附加卡 .
let turnsWithCardsPlayed = [String: [Card]]()
for card in arrayOfCards {
turnsWithCardsPlayed["Turn " + card.turn]!.append(card)
}
我通过包含一个检查是否有任何值的if语句解决了这个问题,如果没有,它会创建一个空白数组然后附加卡 . 然而,在我看来,解决方案很笨重而且太长了 . 有没有更好的方法呢?
let turnsWithCardsPlayed = [String: [Card]]()
for card in arrayOfCards {
if var turnCardArray = turnsWithCardsPlayed["Turn " + card.turn] {
turnsWithCardsPlayed["Turn " + card.turn]!.append(card)
} else {
turnsWithCardsPlayed["Turn " + card.turn] = []
turnsWithCardsPlayed["Turn " + card.turn]!.append(card)
}
}
谢谢你们 :)
4 回答
您可以使用三元运算符来简化它:
我知道你已经找到了自己的解决方案,但请让我来描述一个“更快捷”和更多功能的编程方法 . (当然是恕我直言) .
1.您的解决方案无法编译
是的,可能你已经纠正过了 . 但在您的代码中,您声明
turnsWithCardsPlayed
为常量然后你正在改变它 . 这是不允许的 .
2.现在我的解决方案:卡
我们假设
Card
是一个结构(也许你有一个类)声明如下:好吧,让我们在结构中添加
computed property
(很快就会有用) .3.卡阵列
这只是一个样式首选项,但是如果你有一个
Card
的数组,我觉得变量的自然名称应该只是cards
. 重复变量名称变量本身的类型是没有意义的 .所以
4.避免坏人“!”
我们需要从您的代码中删除的一件事就是这个人
!
因为他有能力让整个应用程序崩溃 . 每个优秀的Swift程序员都应该真的害怕他 .5.功能编程
现在,您只需要重新组织卡片中的元素,并将每个
card
附加到字典的正确插槽中 . 这可以使用reduce
方法 .所以
希望这可以帮助 .
Swift中的数组现在是
Struct
,因为它总是复制 .对于您的解决方案,我建议这样做 .
请注意,您将获得Array的副本,并在更改后将编辑提交回Dictionary .
与您的解决方案类似,但使用三元条件,然后拉出卡的重复附加,因为无论是否需要将数组添加到字典中,都将添加它 .