我遇到以下代码行的问题:
var participants = [String]()
var dict = [String: String]()
func createDictionary() {
var hat = participants
var loopCount = 0
for (keyIndex, key) in hat.enumerate() {
var valueIndex: Int {
var index: Int
repeat {
index = Int(arc4random_uniform(UInt32(hat.count)))
loopCount++
print(loopCount)
if loopCount > participants.count + 1000 {
createDictionary()
}
} while index == keyIndex || dict.values.contains(hat[index])
return index
}
dict[key] = hat[valueIndex]
}
}
我的目标是" dict"包含从"参与者"创建的字典。此函数大部分时间都可以工作,但有时会进入无限循环。我试图这样做,如果它循环超过1000次左右,该函数将重复并重试。
我认为问题在于我无法重置" keyIndex"和"关键"因为那些是"让常数"。但我不确定。
有没有办法重置循环所以这些值?或者让整个函数重试?
答案 0 :(得分:1)
所以,如果有人感兴趣,我能够弄清楚。我还是新手,所以我相信其他人能够更快地解决这个问题:)
无论如何,我更新了代码如下:
var participants = [String]()
var dict = [String: String]()
func createDictionary() {
var hat = participants
var drawName = [String: String]()
var loopCount = 0
for (keyIndex, key) in hat.enumerate() {
var valueIndex: Int {
var index: Int
repeat {
loopCount++
index = Int(arc4random_uniform(UInt32(hat.count)))
} while index == keyIndex || drawName.values.contains(hat[index]) && loopCount < hat.count + 50
return index
}
drawName[key] = hat[valueIndex]
}
if loopCount > hat.count + 30 {
self.createDictionary()
} else {
dict = drawName
}
}
mathielo是对的,我很可能以错误的方式看待这个。基本上我只是指示循环不循环太多次,然后调用函数,如果它必须尝试太多次来获取值。上面的代码可以在不冻结程序的情况下运行。