替换Array of Array中元素的位置

时间:2015-08-30 16:07:26

标签: arrays swift for-loop

我一直在尝试运行此循环来更改基于数组的元素的位置,但我得到以下错误。不确定会出现什么问题。任何想法或想法!谢谢。

enter image description here

var population = [[98, 8, 45, 34, 56], [9, 13, 65, 4, 90], [24, 5, 4, 56, 88], [3, 55, 22, 19, 10]]

private func randomIntergerInRange(low:Int, high:Int) -> Int {
    let randomGeneratedNumber = low + Int(arc4random()) % (high - low);
    return Int(randomGeneratedNumber)
}

for individual in population {
    var mutate = 0.01

    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {

        var positionToMutate = randomIntergerInRange(0, (individual.count - 1))

        var valueToAssign = randomIntergerInRange(minElement(individual), maxElement(individual))

        individual[positionToMutate] = valueToAssign
        print(individual)

    }
}

2 个答案:

答案 0 :(得分:2)

数组按值传递,因此当您在每次迭代时使用int时,会为其分配individual子数组的副本,即使您使用population,也只会变异原始数组的副本。

如果要改变原始数组的值,可以使用索引来实现,例如:

for var individual in population ...

答案 1 :(得分:1)

错误消息的原因:循环中的individual对象是不可变的,它是对象的副本,而不是引用。

您可以使用enumerate

执行此类操作
for (index, individual) in enumerate(population) {
    var mutate = 0.01

    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {

        var positionToMutate = randomIntergerInRange(0, (individual.count - 1))

        var valueToAssign = randomIntergerInRange(minElement(individual), maxElement(individual))

        population[index][positionToMutate] = valueToAssign

        print(population[index])

    }
}

你不应该在迭代时修改一个集合,顺便说一句,它可能有副作用。

更新Swift 2

private func randomIntegerInRange(low:Int, _ high:Int) -> Int {
    let randomGeneratedNumber = low + Int(arc4random()) % (high - low)
    return Int(randomGeneratedNumber)
}

var mutate = 0.01
for (index, individual) in population.enumerate() {
    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {
        var positionToMutate = randomIntegerInRange(0, (individual.count - 1))
        if let min = individual.minElement(), max = individual.maxElement() {
            var valueToAssign = randomIntegerInRange(min, max)
            population[index][positionToMutate] = valueToAssign
            print(population[index])
        }
    }
}