如何解决:构造函数参数不可变

时间:2016-11-04 04:36:53

标签: ios swift

要重构一个函数,我试图将它全局化:

func loadUsers(_ users: [User] , _ tableView: UITableView) {

    let usersRef = firebase.child("Users")
    usersRef.observe(.value, with: { snapshot in
        if snapshot.exists() {

                users.removeAll()
                ...
    }

我收到了:

  

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

当我设置:

func loadUsers(_ users: [User] , _ tableView: UITableView) {

    let usersRef = firebase.child("Users")
    usersRef.observe(.value, with: { snapshot in
        if snapshot.exists() {

            if var users = users as? [User] {
                users.removeAll()
                ...
}

它构建并运行,但我不断收到警告:

  

从'[User]'到'[User]'的条件演员总是成功

     

和   用于检查选项

的“[User]”类型的非可选表达式

解决问题的最佳方法是什么?非常感谢帮助。

PS ,我需要删除users中的原始值。

1 个答案:

答案 0 :(得分:1)

第一组代码中的错误是因为参数是不可变的。

第二组代码中的错误是因为您试图将if let与非可选常量一起使用,并且您试图转换为相同的类型,使得转换无意义。

由于您希望此函数修改原始数组,因此您需要将其设为inout参数:

func loadUsers(_ users: inout [User] , _ tableView: UITableView) {
    let usersRef = firebase.child("Users")
    usersRef.observe(.value, with: { snapshot in
        if snapshot.exists() {
            users.removeAll()
            ...
}

您现在还需要在传递给&参数的var之前添加users