[英]Why am I getting this error when accessing Facebook information of user?
[英]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
評估您的謂詞,其中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)
}
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.