Swift:将一个元素添加到字典

时间:2015-09-16 12:30:56

标签: swift

我是从Swift开始的,现在我已经坚持这个问题了一段时间。我正在尝试通过一系列卡片并将它们添加到一个字典下的一个字典下,该键代表它们被播放的转弯。

我创建了一个词典 turnsWithCardsPlayed ,它应该包含一个键:这样的值对 - “转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 个答案:

答案 0 :(得分:2)

您可以使用三元运算符来简化它:

for card in arrayOfCards {
    turnsWithCardsPlayed["Turn " + card.turn] == nil ? turnsWithCardsPlayed["Turn " + card.turn] = [card] : turnsWithCardsPlayed["Turn " + card.turn]!.append(card)
}

答案 1 :(得分:1)

我知道你找到了自己的解决方案,但是请让我来描述一个更快的解决方案。和更多功能编程方法。 (恕我直言)。

1。您的解决方案无法编译

是的,可能你已经纠正过了。但是在您的代码中,您将turnsWithCardsPlayed声明为常量

let turnsWithCardsPlayed = [String: [Card]]()

然后你要改变它。这是不允许的。

2。现在我的解决方案:卡

让我们假设Card是一个结构(也许你有一个类),声明如下:

struct Card {
    let turn: Int
}

很好,我们可以在结构中添加computed property(很快就会有用)。

struct Card {
    let turn: Int
    var key: String { return "Turn \(turn)" }
}

3。卡阵列

这只是一个样式首选项,但是如果你有一个Card数组,我觉得变量的自然名称应该只是cards。没有必要在变量名称中重复变量本身的类型。

所以

let cards = [Card(turn: 0), Card(turn: 1), Card(turn: 1), Card(turn: 2), Card(turn: 1), Card(turn: 0)]

4。避免坏人"!"

我们需要从代码中删除的一件事就是这个人!,因为他有能力让整个应用程序崩溃。每个好的Swift程序员都应该真的害怕他。

5。功能编程

现在,您只需要重新组织卡片中的元素,并将每个card附加到字典的正确插槽中。这可以使用reduce方法。

所以

let turns = cards.reduce([String:[Card]]()) { (var accumulator, card) -> [String:[Card]] in
    var list = accumulator[card.key] ?? [Card]()
    list.append(card)
    accumulator[card.key] = list
    return accumulator
}

希望这有帮助。

答案 2 :(得分:0)

Swift中的数组现在是Struct,因为它总是复制。

对于您的解决方案,我建议您这样做。

请注意,您将获得一个Array副本,并在更改后将编辑提交回Dictionary。

let turnsWithCardsPlayed = [String: [Card]]()
for card in arrayOfCards {
    //verify if have cards in dictionary and get it
    if var cards = turnsWithCardsPlayed["Turn " + card.turn] {
        //append element card in copied array
        cards.append(card)
    }else{ 
        // if no has array create new and append new card
        cards = []
        cards.append(card)
    }
    //commit in dictionary your new or modified array
    turnsWithCardsPlayed["Turn " + card.turn] = cards
}

答案 3 :(得分:0)

与您的解决方案类似,但使用三元条件,然后拉出卡的重复附加,因为无论是否需要将数组添加到字典中,都会添加它。

let turnsWithCardsPlayed = [String: [Card]]()
for card in arrayOfCards {
    turnsWithCardsPlayed["Turn " + card.turn] != nil ? () : turnsWithCardsPlayed["Turn " + card.turn] = []
    turnsWithCardsPlayed["Turn " + card.turn]!.append(card)
}