不能在不可变值上使用变异成员:'i'是'let'常量

时间:2018-04-03 16:31:29

标签: swift

我编写了我的代码,但错误发生了。

我的代码出了什么问题?

class UserCollectionViewModel {

    var userDataArray:[[String]] = []

    func getUserDevData(userId: String) -> Array<[String]> {
        for i in userDataArray{
            i.append([]) // Cannot use mutating member on immutable value: 'i' is a 'let' constant
            i[0].append("Alpha") // Cannot use mutating member on immutable value: 'i' is a 'let' constant
        }
        return userDataArray
    }

}

2 个答案:

答案 0 :(得分:1)

Swift数组是值类型,而不是引用类型。这意味着在这段代码中:

let array = [1, 2, 3, 4]
var copy = array
copy.append(5)

copy现在有5个元素,但array仍然只有4个元素的初始值。

for循环也是如此:

let arrayOfArrays = [[1], [2], [3]]
for array in arrayOfArrays {
    // array is a *copy* of one of the sub-arrays of `arrayOfArrays`.
}

您可以迭代遍历数组的索引:

func getUserDevData(userId: String) -> [[String]] {
    for i in userDataArray.indices {
        userDataArray[i].append([])
        userDataArray[i][0].append("Alpha")
    }
    return userDataArray
}

我不确定这是你想要的,但是,因为你的代码(原样)不进行类型检查。 i.append([])是一项不可能的操作,因为i[String]:您只能append String为其值,而不是空数组,i.append(contentsOf: [])毫无意义,因为它什么也没做。

所以我希望这个例子让你畅通无阻,但这里也存在行为问题。如果您的程序仍无法正常工作,修复编译器错误将无济于事。

答案 1 :(得分:0)

请看这个。

class UserCollectionViewModel {

var userDataArray:[[String]] = []

var strinArray =  [String]()
func getUserDevData(userId: String) -> Array<[String]> {
    for index in 0..<userDataArray.count {
        userDataArray[index].append(contentsOf: [])
        userDataArray[index][0].append("alpha")
    }
    return userDataArray
}
}

希望这有帮助!