更改数组

时间:2015-04-27 08:05:35

标签: swift

我有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'的不可变值”

当我重写一个执行相同目的的简化函数时,我没有得到错误,但奇怪的是并非所有数字都被替换。

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   

不确定如何解决。关于如何清理我的代码的建议也将受到赞赏。谢谢!

3 个答案:

答案 0 :(得分:1)

“无法分配给'Int'类型的不可变值”是因为参数实际上是常量。你可以阅读这一行:

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

为:

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

您可以通过将var放在参数前面并返回数组来更改它。另一种选择是使用&使其成为引用,因此您不必返回新数组。

答案 1 :(得分:0)

我建议你研究一下数组的map函数: https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Array.html

你会使用例如:

array.map {
   if ($0 satisfies condition) {
       generate random number 
   }
}

答案 2 :(得分: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更新:

从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)