2015-04-27 5 views
0

У меня есть 3 массива типа Int, которые имеют по 5 значений в каждом из них. Я пытаюсь создать функцию, которая заменяет значения на основе условий. Например, array1, если значение индекса находится между 2-5, замените произвольно сгенерированное число между 1-6.Изменение конкретных значений в массиве

Вот то, что я до сих пор

import Foundation 

func newRandomNumbers(#array1: [Int], array2: [Int], array3: [Int]) { 

for i in 0..<5 { 
    switch (array1[i]) { 
    case 2, 3, 4, 5: 
     let randomNumber = Int(1 + arc4random() % 6) 
     array1[i] = randomNumber 

     break; 

    default: 
     break; 
    } 

    switch (array2[i]) { 
    case 2, 3, 4, 5: 

     array2[i] 
     break; 
    default: 
     break; 
    } 

    switch (array3[i]) { 
    case 1, 2, 3, 4, 5: 

     array3[i] 
     break; 
    default: 
     break; 
    } 
} 
} 

Я получаю сообщение об ошибке «Невозможно присвоить неизменное значение типа" Int»

Когда я переписать упрощенную функцию, которая делает ту же цель I не получите ошибку, но странно не все числа заменены.

import Foundation 


var newArray = [2,3,4,5,6] 

func newRandom(#array1: [Int]){ 
    for i in 0..<5 { 
     switch(array1[i]) { 
      case 2, 3, 4, 5: 
       let randomNumber = Int(1 + arc4random() % 6) 
       newArray[1] = randomNumber 
      default: 
       break; 
     } 
    } 
} 

newRandom(array1: newArray) 

newArray 

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

+2

поставил newArray [я] = randomNumber вместо newArray [1] = randomNumber –

ответ

1

«Нельзя присвоить неизменяемое значение типа« Int », потому что параметры на самом деле являются константами. Вы можете прочитать строку:

func newRandomNumbers(#array1: [Int], array2: [Int], array3: [Int]) 

как:

func newRandomNumbers(#array1 let array1: [Int], let array2: [Int], let array3: [Int]) 

Вы можете изменить его, поставив var перед параметром и возвращает массив. Другой вариант - использовать &, чтобы сделать его ссылкой, поэтому вам не нужно возвращать новый массив.

0

Вы можете использовать inout для каждого из параметров функции и добавить & перед вашей переменной имя при вызове функции, оно будет изменить массив на месте:

func newRandom(inout myArray: [Int]) { 
    for (index, element) in enumerate(myArray) { 
     switch element { 
     case 2...5: 
      myArray[index] = Int(1 + arc4random() % 6) 
     default: 
      break 
     } 
    } 
} 

var newArray = [2,3,4,5,6] 
newRandom(&newArray) 
println(newArray) // "newArray" was modified, contains random numbers 

Примечание:

switch element { 
case 2...5: 

эквивалентно:

if element >= 2 && element <= 5 { 

SWIFT 2.0 UPDATE:

По состоянию Swift 2.0, enumerate теперь должны быть вызваны в самой последовательности. Кроме того, println устарел в пользу print:

func newRandom(inout myArray: [Int]) { 
    for (index, element) in myArray.enumerate() { 
     switch element { 
     case 2...5: 
      myArray[index] = Int(1 + arc4random() % 6) 
     default: 
      break 
     } 
    } 
} 

var newArray = [2,3,4,5,6] 
newRandom(&newArray) 
print(newArray) 
Смежные вопросы