【发布时间】:2018-12-05 15:50:19
【问题描述】:
正如您可能通过这个问题所说的那样,我是 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 上使用扩展来添加密码验证。但是,当我尝试对电子邮件执行相同操作时,会出现编译错误。这是为什么呢?
【问题讨论】:
-
哪里叫
isValidPassword()?此外,奇怪的是,您使用evaluate(with: self),但self是UIViewController,而不是String。你的意思是extension String{},在这种情况下self是正确的,还是isValidPassword(_ string: String) -> Bool { ... return ... evaluate(with: string) }? -
我没有看到你在任何地方调用 isValidPassword()。您还需要在其中传递一个字符串参数。
-
你和大卫都提到不调用函数(新手错误!)。目前我正在使用扩展 UITextField 的方法,因为使用传递字符串的函数会给我带来大量错误@Larme
-
我现在正在调用 containsValidPassword(),您能帮忙解释一下为什么当我尝试传递字符串参数时,会出现这么多编译错误吗? @敢
标签: ios swift regex validation google-cloud-firestore