2015-08-30 4 views
2

Я пытаюсь запустить этот цикл, чтобы изменить положение элемента в массиве, но я получаю ошибку ниже. Не совсем уверен, что может быть неправильно. Любые мысли или идеи! Благодарю.Замена положения элемента в массиве массива

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) 

    } 
} 
+0

почему ваш массив выглядеть как словарь – Lamar

+0

Это массив из массивов @Lamar;) – Gugulethu

ответ

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]) 
     } 
    } 
} 
+1

Спасибо. ;). Я не был уверен! – Gugulethu

2

массива передаются по значению, поэтому при использовании individual на каждой итерации присваивается копию подмассива population, и даже если вы используете for var individual in population ... вы мутировать только копия исходного массива.

Если вы хотите, чтобы мутировать значения исходного массива вы можете сделать это с помощью индексов, например:

for index in population.indices { 
    var mutate = 0.01 

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

     var positionToMutate = randomIntergerInRange(0, (population[index].count - 1)) 

     var valueToAssign = randomIntergerInRange(minElement(population[index]), maxElement(population[index])) 

     population[index][positionToMutate] = valueToAssign 
     print(population[index]) 

    } 
} 
+0

О, я вижу. Я не знал об этом. Большое спасибо. ;) @Renzo – Gugulethu

Смежные вопросы