如何修复'不能在不可变值上使用变异成员'?

时间:2017-03-01 19:38:10

标签: swift

获取错误:

  

错误:不能在不可变值上使用变异成员:' fromArray'是一个“让...”恒定

在以下代码中:

func removing (item: Int, fromArray: [Int]) -> [Int] {

    for i in 0...fromArray.count-1 {
        if fromArray[i] == item {
            let index = i
            fromArray.remove(at: index) // <-- error is here
        }
    }
    return fromArray
}

var anarray : [Int] = [1, 2,3, 4 ,3]
var x = 3
removing(item: x, fromArray: anarray)

4 个答案:

答案 0 :(得分:8)

好吧,你也有从数组中删除元素然后超出其范围的问题。试试这样:

func removeInPlace(item: Int, fromArray: inout [Int]) -> Void {

    for i in stride(from: fromArray.count - 1, to: 0, by: -1)
    {
        if fromArray[i] == item {
            fromArray.remove(at: i)
        }
    }

}

var anarray : [Int] = [1, 2,3, 4 ,3]

var x = 3

print(anarray)    // prints [1, 2, 3, 4, 3]

removeInPlace(item: x, fromArray: &anarray)

print(anarray)    // prints [1, 2, 4]

您需要额外的错误处理,但希望这有助于您继续前进。

答案 1 :(得分:5)

默认情况下,swift中的参数是常量,但是如果你想在函数中改变它,那么它需要在inout变量中就位。您可以通过将参数指定为inout来实现它,如下所示

func removing (item: Int, fromArray : inout [Int]) -> [Int]

答案 2 :(得分:2)

如果要修改方法内的方法参数,可以使用inout关键字声明它(请参阅the docs):

func removing(item: Int, fromArray: inout [Int]) -> [Int]
{
    ...
}

如果没有inout关键字,则所有方法参数都是常量值。

答案 3 :(得分:2)

您看到的错误是由于尝试从只读数组中删除数组值。也就是说,fromArray是只读的,因此是不可变的。你有两个选择。

选项#1:通过向其添加inout使输入数组成为读写,并且不返回任何内容:

func removing (item: Int, fromArray: inout [Int]) {

    for i in 0...fromArray.count-1 {
        if fromArray[i] == item {
            let index = i
            fromArray.remove(at: index) // Error : cannot use mutating member on immutable value : 'fromArray' is a 'let' constant
        }
    }
}

选项#2:按原样使用该功能,但将阵列复制到新阵列中

func removing (item: Int, fromArray: inout [Int]) {

    var newArray = fromArray
    for i in 0...newArray.count-1 {
        if newArray[i] == item {
            let index = i
            newArray.remove(at: index) 
        }
    }
    return newArray
}

除非inout指示,否则传递给Swift中的函数的任何参数始终是只读的。