Почему я НЕ получаю сообщение об ошибке при проверке пароля? - PullRequest
0 голосов
/ 05 декабря 2018

Как вы, вероятно, можете сказать по этому вопросу, я новичок в iOS / программировании: я пытаюсь реализовать проверку пароля, в которой пользовательский ввод должен содержать не менее 8 символов, содержать 1 заглавную букву, 1строчная буква, 1 цифра и 1 специальный символ .Я решил использовать регулярное выражение и расширение на UIViewController, чтобы сделать это. Я где-то читал, что мне нужно включить это за пределы моей области видимости "SignUpViewController" (не знаю почему) , что я и сделал. В БД есть открытые правила чтения / записи, так как я все еще тестирую вещи , так почему же он не проверяет эту проверку и не регистрирует пользователя каждый раз?Пожалуйста, помогите

Ниже приведен код:

import UIKit
import Firebase



class SignUpViewController: UIViewController {

    //Outlets
    @IBOutlet weak var firstNameText: UITextField!
    @IBOutlet weak var lastNameText: UITextField!
    @IBOutlet weak var emailText: UITextField!
    @IBOutlet weak var passwordText: UITextField!
    @IBOutlet weak var signUpButton: UIButton!


    override func viewDidLoad() {
        super.viewDidLoad()
    }


    @IBAction func signUpButtonTapped(_ sender: Any) {
        guard let firstName = firstNameText.text,
            let lastName = lastNameText.text,
            let email = emailText.text else { return }
            guard emailText.containsValidEmail() else {
            print("Invalid email. Please try again.")
            return
        }
            let password = passwordText.text else { return }
            guard passwordText.containsValidPassword() else {
            print("Invalid password. Please try again.")
            return
        }

        Auth.auth().createUser(withEmail: email, password: password) { (authResult, error) in
            if let error = error {
                debugPrint("Error creating user: \(error.localizedDescription)")
            }
            let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
            changeRequest?.displayName = firstName
            changeRequest?.commitChanges(completion: { (error) in
                if let error = error {
                    debugPrint(error.localizedDescription)
                }
            })
            guard let userId = authResult?.user else { return }
            let userData: [String: Any] = [
                "firstName" : "",
                "lastName" : "",
                "User ID" : userId,
                "dateCreated" : FieldValue.serverTimestamp(),
                ]
            let db = Firestore.firestore()
            db.collection("users").document("one").setData(userData) { err in
                if let err = err {
                    print("Error writing document: \(err)")
                } else {
                    print("Document successfully written!")
                }
            }
        }
    }
}
public extension UITextField {
    func containsValidPassword() -> Bool {
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
        return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: self.text)
    }
}
public extension UITextField {
    func containsValidEmail() -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self.text)
    }
}

ОБНОВЛЕНИЕ 12/14: я отредактировал исходное сообщение, добавив расширения для проверки пароля и электронной почты.Я добавил проверку пароля с помощью расширения на UITextField.Однако, когда я пытаюсь сделать то же самое для электронной почты, я получаю ошибки компиляции.Почему это?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы оцениваете свой предикат с помощью self, где self имеет тип UIViewController (это то, что вы расширяете), вы, вероятно, хотели расширить String вместо.

extension String {
    func isValidPassword() -> Bool {
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
        return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: self)
    }
}

Использование:

let isValidPassword = "something".isValidPassword()

На самом деле я не уверен, что расширения соответствуют этому условию, я бы порекомендовал вам создать простую функцию внутри вашего SignUpViewController -

func isValidPassword(password: String) -> Bool {
    let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
    return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: password)
}

Или если вы хотите быть более конкретным -

func isValidPassword() -> Bool{
    guard let password = passwordText.text else { return false }

    let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
    return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: password)
}
0 голосов
/ 16 декабря 2018
import UIKit
import Firebase



class SignUpViewController: UIViewController {

    //Outlets
    @IBOutlet weak var firstNameText: UITextField!
    @IBOutlet weak var lastNameText: UITextField!
    @IBOutlet weak var emailText: UITextField!
    @IBOutlet weak var passwordText: UITextField!
    @IBOutlet weak var signUpButton: UIButton!


    override func viewDidLoad() {
        super.viewDidLoad()
    }


    @IBAction func signUpButtonTapped(_ sender: Any) {
        guard let firstName = firstNameText.text,
            let lastName = lastNameText.text,
            let email = emailText.text else { return }
            guard emailText.containsValidEmail() else {
            print("Invalid email/password. Please try again.")
            return
        }
            guard let password = passwordText.text else { return }
            guard passwordText.containsValidPassword() else {
            print("Invalid email/password. Please try again.")
            return
        }

        Auth.auth().createUser(withEmail: email, password: password) { (authResult, error) in
            if let error = error {
                debugPrint("Error creating user: \(error.localizedDescription)")
            }
            let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
            changeRequest?.displayName = firstName
            changeRequest?.commitChanges(completion: { (error) in
                if let error = error {
                    debugPrint(error.localizedDescription)
                }
            })
            guard let userId = authResult?.user else { return }
            let userData: [String: Any] = [
                "firstName" : "",
                "lastName" : "",
                "User ID" : userId,
                "dateCreated" : FieldValue.serverTimestamp(),
                ]
            let db = Firestore.firestore()
            db.collection("users").document("one").setData(userData) { err in
                if let err = err {
                    print("Error writing document: \(err)")
                } else {
                    print("Document successfully written!")
                }
            }
        }
    }
}
public extension UITextField {
    func containsValidPassword() -> Bool {
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
        return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: self.text)
    }
}
public extension UITextField {
    func containsValidEmail() -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self.text)
    }
}

Этот формат работает должным образом.Спасибо

0 голосов
/ 05 декабря 2018

Прежде всего, вы не вызываете функцию isValidPassword в вашем коде.Во-вторых, если бы вы на самом деле вызывали его, это вызвало бы исключение времени выполнения, поскольку вы пытались бы передать UIViewController экземпляр NSPredicate для сопоставления с регулярным выражением.

Вы должны скорееопределить isValidPassword для UITextField и проверить его text свойство.(В этом случае я бы также переименовал функцию в containsValidPassword, поскольку UITextField не является паролем, он просто содержит строку для пароля.)

extension UITextField {
    func containsValidPassword() -> Bool {
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
        return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: self.text)
    }
}

Тогда вам также потребуетсявызвать валидацию:

@IBAction func signUpButtonTapped(_ sender: Any) {
    guard let firstName = firstNameText.text,
        let lastName = lastNameText.text,
        let email = emailText.text,
        let password = passwordText.text else { return }
    guard passwordText.containsValidPassword() else { 
        // Let the user know that their pwd is incorrect
        return
    }
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...