簡體   English   中英

為什么我在測試密碼驗證時沒有收到錯誤消息?

[英]Why am I NOT getting an error when I test password validation?

正如您可能通過這個問題告訴我的,我是 iOS/編程的新手:我正在嘗試實現密碼驗證,其中用戶輸入必須至少為8 個字符,包含 1 個大寫字母、1 個小寫字母、1 個數字, 和 1 個特殊字符 我決定在 UIViewController 上使用正則表達式和擴展來做到這一點。 我在某處讀到我必須將它包含在我的“SignUpViewController”范圍之外(不知道為什么) ,這就是我所做的。 db 確實有開放的讀/寫規則,因為我仍在測試事物,所以它不檢查此驗證並每次都注冊用戶的原因是什么? 請幫忙

下面是代碼:

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)
    }
}

2014 年 12 月更新:我通過添加密碼和電子郵件驗證的擴展來編輯原始帖子。 我通過在 UITextField 上使用擴展添加了密碼驗證。 但是,當我嘗試對電子郵件執行相同操作時,出現編譯錯誤。 為什么是這樣?

首先,您沒有在代碼中的任何地方調用isValidPassword函數。 其次,如果你真的調用它,它會導致運行時異常,因為你會嘗試將UIViewController實例傳遞給NSPredicate以匹配正則表達式。

您應該在UITextField上定義isValidPassword並驗證其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
    }
...

您正在使用self評估您的謂詞,其中selfUIViewController類型(這就是您要擴展的內容),您可能打算改為擴展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)
}
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)
    }
}

此格式按預期運行。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM