Swift(iOS/macOS)中的数据验证:工具与库概述
数据验证是使用 Swift 开发高质量移动和桌面应用程序的关键方面之一。它可以确保用户输入的数据符合预期的格式和业务规则。在本文中,我们将探讨 Apple 生态系统中的主要方法、内置机制和流行的验证库。
为什么验证很重要?
没有验证,应用程序可能会收到不正确的数据,从而导致:
- 服务器端错误
- 客户端意外崩溃
- 安全漏洞(SQL注入、XSS)
- 糟糕的用户体验
Swift 和 Foundation 的内置功能
Swift 和 Foundation 框架提供了基础但强大的验证工具。
1. 使用 NSPredicate 进行验证
NSPredicate 是一个用于过滤和验证数据的强大工具。它支持正则表达式,使其便于验证电子邮件、电话号码和其他字符串。
import Foundation
func isValidEmail(_ email: String) -> Bool { let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,64}" let predicate = NSPredicate(format:"SELF MATCHES %@", emailRegEx) return predicate.evaluate(with: email)}
// 使用示例let testEmail = "user@example.com"print(isValidEmail(testEmail)) // true2. 通过 NSRegularExpression 进行验证
对于更复杂的场景,使用 NSRegularExpression 很方便。
func isValidPassword(_ password: String) -> Bool { // 至少8个字符,一个大写字母,一个小写字母,一个数字 let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)[a-zA-Z\\\\d]{8,}$" do { let regex = try NSRegularExpression(pattern: passwordRegex) let range = NSRange(location: 0, length: password.utf16.count) return regex.firstMatch(in: password, options: [], range: range) != nil } catch { return false }}
print(isValidPassword("Swift1234")) // trueprint(isValidPassword("swift123")) // false(缺少大写字母)流行的验证库
虽然内置工具足以处理简单任务,但对于包含多个规则的复杂表单,使用专门的库更方便。
1. Validator(来自 Adam Waite)
Swift 中最流行的字符串验证库之一。支持规则链和自定义验证器。
// 通过 SPM 安装:.package(url: "https://github.com/adamwaite/Validator.git", from: "3.0.0")import Validator
let emailRule = ValidationRulePattern(pattern: EmailValidationPattern.standard, error: "无效的电子邮件")let nameRule = ValidationRuleLength(min: 2, max: 50, error: "名称长度应在2到50个字符之间")
let email = "test@mail.ru"let result = email.validate(rule: emailRule)switch result {case .valid: print("电子邮件有效")case .invalid(let errors): print(errors.first?.message ?? "错误")}2. SwiftValidators(来自 gkaimakas)
一个轻量级库,具有声明式语法。非常适合实时字段验证。
import SwiftValidators
let phone = "+7 (999) 123-45-67"if Validator.isPhoneNumber().trim().validate(phone) { print("电话号码有效")} else { print("格式无效")}使用 Combine 在 SwiftUI 中进行验证
现代 SwiftUI 应用程序通常使用 Combine 进行响应式验证。这允许在输入时立即显示错误。
import SwiftUIimport Combine
class RegistrationViewModel: ObservableObject { @Published var email = "" @P