Свифт словарь молча не хранит новые предметы - PullRequest
0 голосов
/ 31 мая 2018

Мне нужен совет.Вот кодЯ пытаюсь добавить элементы в словарь после удаления некоторых из них.Но ничего не меняется.Зачем?Где я не прав?

Эта структура, как и демо с внедренным протоколом Equatable.

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)

Есть ли какие-то значения - ссылочные нюансы, о которых я не знаю?

1 Ответ

0 голосов
/ 31 мая 2018

Вы удаляете случайные ключи из словаря, и это может оставить значение 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...