Swift 斯威夫特字典';不要储存新物品

Swift 斯威夫特字典';不要储存新物品,swift,dictionary,Swift,Dictionary,我需要一些建议。这是代码。我试图在删除一些条目后将其添加到词典中。但一切都没有改变。为什么?我错在哪里 此结构与实现了equalable协议的演示一样 struct Card: Equatable { static func == (lhs: Card, rhs: Card) -> Bool { return (lhs.color == rhs.color || lhs.number == rhs.number

我需要一些建议。这是代码。我试图在删除一些条目后将其添加到词典中。但一切都没有改变。为什么?我错在哪里

此结构与实现了
equalable
协议的演示一样

struct Card: Equatable {
    static func == (lhs: Card, rhs: Card) -> Bool {
        return
            (lhs.color == rhs.color ||
                lhs.number == rhs.number ||
                lhs.shading == rhs.shading ||
                lhs.symbol == rhs.symbol)
    }
    var number = 0
    var symbol = 0
    var shading = 0
    var color = 0

    var isSelected = false
    var isSet = false
}
这是一个纸牌游戏模型,在本例中只是演示

struct gameSet {
    var cards = [Card]()
    var cardField = [Int:Card]()

    init () {
        for num in 1...3 {
            for sym in 1...3 {
                for sha in 1...3 {
                    for col in 1...3 {
                        cards += [Card(number: num, symbol: sym, shading: sha, color: col, isSelected: false, isSet: false)]
                    }
                }
            }
        }
    }
}
Int的扩展来获取随机数

extension Int {
    var random: Int {
        return Int(arc4random_uniform(UInt32(self)))
    }
}
var game = gameSet()

// cardField gets 24 random items from game.cards

var cardCount = 24

repeat {
    let randomCard = game.cards[(game.cards.count-1).random]
    game.cardField[game.cardField.count] = randomCard
    game.cards.remove(at: game.cards.index(of: randomCard)!)
    cardCount -= 1
} while cardCount != 0

// we got 24 items in cardField dictionary
print(game.cardField.count)

// delete 3 random items from cardField

for _ in 1...3 {
    let randomKey = game.cardField.count.random
    game.cardField.removeValue(forKey: randomKey)
}

// we got 21 items in cardField dictionary, ok
print(game.cardField.count)

// let's add 3 another items to cardField dictionary same way
var cardCount2 = 3

repeat {
    let randomCard = game.cards[(game.cards.count-1).random]
    game.cardField[game.cardField.count] = randomCard
    game.cards.remove(at: game.cards.index(of: randomCard)!)
    cardCount2 -= 1
} while cardCount2 != 0

// nothing changed! cardFiled still have 21 items as after deletion WHY???
print(game.cardField.count)

是否存在任何我不知道的值引用细微差别?

您正在从字典中删除随机键,这可能会留下dic[21]值,而您的计数仍然是21。然后您正在更新索引21,但计数不变。您也可以将数组用于cardFields

repeat {
    let randomCard = game.cards[(game.cards.count-1).random]
    game.cardField.append(randomCard)
    game.cards.remove(at: game.cards.index(of: randomCard)!)
    cardCount -= 1
} while cardCount != 0

// we got 24 items in cardField dictionary
print(game.cardField.count)

// delete 3 random items from cardField

for _ in 1...3 {
    let randomKey = game.cardField.count.random
    game.cardField.remove(at: randomKey)
}

// we got 21 items in cardField dictionary, ok
print(game.cardField.count)

// let's add 3 another items to cardField dictionary same way
var cardCount2 = 3

repeat {
    let randomCard = game.cards[(game.cards.count-1).random]
    game.cardField.append(randomCard)
    game.cards.remove(at: game.cards.index(of: randomCard)!)
    cardCount2 -= 1
} while cardCount2 != 0

// nothing changed! cardFiled still have 21 items as after deletion WHY???
print(game.cardField.count)

您不应该在
static func==
中使用
&&&
来检查所有属性是否相同吗?不,问题不在于协议。是关于字典的。我无法使用以前使用并删除的键添加值。