Не удается присвоить значение: ‘user’ — константа ‘let’ — ИСПРАВЛЕНО

#swift

#swift

Вопрос:

Я пытаюсь создать страницу входа, на которой пользователь входит в систему с авторизацией по электронной почте / паролю, и если они объявлены администратором или пользователем, performSegue переходит на другую страницу.

Вот мой код:

 @IBAction func submit(_ sender: UIButton) {
    if let email = txtemail.text, let passowrd = txtpass.text {
        Auth.auth().signIn(withEmail: email, password: passowrd) { (user, error) in
            Database.database().reference().child("user").child("admin")
            if user = true {
                self.performSegue(withIdentifier: "adminlogin", sender : self)
            }
            if user = false {
                self.performSegue(withIdentifier: "login", sender : self)
            }
        }
    }
  

Однако продолжает появляться эта ошибка:

Не удается присвоить значение: ‘user’ является константой ‘let’

ОТВЕТИЛ:

Я исправил это, выполнив это в своем коде:

 { Auth.auth().signIn(withEmail: email, password: passowrd) { (user, error) in
            if user != nil {
            let uid = Auth.auth().currentUser?.uid
                Database.database().reference().child("user").child(uid!).child("admin").observeSingleEvent(of: .value, with: { (snapshot) in

                    // Checking if user is found
                    if snapshot.exists() {
                        // admin is found
                        self.performSegue(withIdentifier: "adminlogin", sender : self)
                    } else {
                        // admin is not found going to user login
                        self.performSegue(withIdentifier: "login", sender : self)
                    }
                })
  

Теперь, когда я вхожу в систему с помощью администратора, я перехожу к другому контроллеру представления, чем если бы я входил в систему с пользователем.

Комментарии:

1. Вы должны просто это проверить if condition { ... } else { } . Кроме того, user требуется лучшее имя. Что значит user быть true или false ? Что-то лучше было бы userIsAdmin

Ответ №1:

= используется в качестве оператора присваивания

== является оператором сравнения

Вы хотите использовать == для сравнения.

Объекты user и error неизменяемы, что означает, что вы не можете их изменить. Но они содержат значения, которые вы хотите проверить.

Я обновил ваш код, чтобы он работал:

  @IBAction func submit(_ sender: UIButton) {

    if let email = txtemail.text, let passowrd = txtpass.text

    {
        Auth.auth().signIn(withEmail: email, password: passowrd) { (user, error) in
            Database.database().reference().child("user").child("admin")
            if user == true {
                self.performSegue(withIdentifier: "adminlogin", sender : self)
            }
            if user == false {
                self.performSegue(withIdentifier: "login", sender : self)
            }
        }
    }

}
  

Комментарии:

1. получение ошибки » Двоичный оператор ‘==’ не может быть применен к операндам типа ‘AuthDataResult?’ и ‘Bool’ »

Ответ №2:

Вы поместили if user = true единственное = значение присваивания. Чтобы проверить, равно ли значение чему-либо, используйте if user == true

Комментарии:

1. К сожалению, получаю ошибку » Двоичный оператор ‘==’ не может быть применен к операндам типа ‘AuthDataResult?’ и ‘Bool»

2. Так user это не Bool?

3. Извините, я очень новичок в swift. Я так не думаю, однако я думаю, что это должно быть либо истинным, либо ложным утверждением.

4. Вы можете проверить, является ли что-то истинным или ложным, только если user само по себе является Bool. Если user это не Bool, то вы не можете. Вы пытаетесь определить, user существует ли (т. Е. не равно нулю)?

Ответ №3:

Вы не можете проверить, является ли пользователь администратором или нет, сравнивая его с true или false. Я предлагаю войти в систему пользователя и после этого проверить, является ли UID администратором, таким образом:

 let databaseRef = Database.database().reference(withPath: "user/admin/(UID after logged in)")

databaseRef.observeSingleEvent(of: .value, with: { (snapshot) in

    // Checking if user is found
    if snapshot.exists() {
        // admin is found 
        self.performSegue(withIdentifier: "adminlogin", sender : self)
    } else {
        // admin is not found going to user login
        self.performSegue(withIdentifier: "login", sender : self)
    }
})
  

Комментарии:

1. Не могли бы вы объяснить это более подробно, пожалуйста. Что касается того, куда мне поместить этот код на фактической странице входа в систему?