Проблема в том, что Int(arc4random())%windCard.count
генерирует ключи в диапазоне от 0
до windCard.count-1
, в то время как ваши ключи начинаются с 1 и после удаления первого элемента, ключи даже не будут смежными.Так, например, если вы удалите ключ из середины Dictionary
(скажем, ключ 5
), windCard
будет иметь 9 элементов и, следовательно, die
будет в диапазоне 0-8
, но ваш Dictionary
будет отсутствовать ключ, поэтому ваш код будет аварийно завершен на windCard[key]!
, если die
равен 5
.
Вы можете достичь своей цели, используя arc4random_uniform
, который принимает входной аргумент upperBound
и использовать сгенерированное случайное число для индексации keys
вашего windCard
Dictionary
, который будет гарантированно непрерывным.
while windCard.count > 0 {
let die = Int(arc4random_uniform(UInt32(windCard.keys.count)))
let key = Array(windCard.keys)[die]
print("The wind blow the mosquitoes \(windCard[key]!)")
windCard.removeValue(forKey: key)
}