#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. Не могли бы вы объяснить это более подробно, пожалуйста. Что касается того, куда мне поместить этот код на фактической странице входа в систему?