如何在swift 2中重置for循环中的值

时间:2016-01-04 17:13:27

标签: for-loop dictionary while-loop swift2 enumerate

我遇到以下代码行的问题:

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"和"关键"因为那些是"让常数"。但我不确定。

有没有办法重置循环所以这些值?或者让整个函数重试?

1 个答案:

答案 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是对的,我很可能以错误的方式看待这个。基本上我只是指示循环不循环太多次,然后调用函数,如果它必须尝试太多次来获取值。上面的代码可以在不冻结程序的情况下运行。