2015-08-30 150 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]) 

    } 
} 

在迭代它你不應該修改數據收集,順便說一句,它可能有副作用。

更新斯威夫特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它分配​​的子陣列的複製,即使你使用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