Swift(iOS/macOS)中的数据验证:库、工具与实践示例
数据验证是开发高质量 iOS 和 macOS 应用的关键方面之一。如果没有可靠的输入数据检查,用户可能会遇到错误、界面行为异常甚至崩溃。本文将介绍 Swift 中数据验证的最佳库和方法,并提供具体的代码示例。
为什么需要数据验证?
验证可以:
- 确保输入数据的正确性(电子邮件、电话号码、密码)。
- 防止服务器端错误。
- 通过即时反馈改善用户体验。
- 提高应用程序的安全性。
Swift 中流行的验证库
目前有多个经过验证的库可以简化数据验证:
- Validated — 一个轻量级库,支持 Combine 和 SwiftUI。
- SwiftValidator — 最早的文本字段验证库之一。
- Validator(来自 Adamwaite)— 一个简单灵活的工具,内置多种规则。
- Regex — 不是库,而是用于处理正则表达式的内置机制,常用于验证。
示例 1:使用正则表达式验证电子邮件
最简单的方法是使用 NSRegularExpression 或内置方法 range(of:options:)。
import Foundation
func isValidEmail(_ email: String) -> Bool { let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,64}" let emailPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex) return emailPredicate.evaluate(with: email)}
// 使用print(isValidEmail("test@example.com")) // trueprint(isValidEmail("invalid-email")) // false示例 2:密码验证(长度、数字和字符)
通常要求密码至少包含 8 个字符,至少一个数字和一个特殊字符。
func isValidPassword(_ password: String) -> Bool { // 至少 8 个字符 guard password.count >= 8 else { return false } // 检查是否包含数字 let digitRegex = ".*[0-9]+.*" let digitPredicate = NSPredicate(format: "SELF MATCHES %@", digitRegex) guard digitPredicate.evaluate(with: password) else { return false } // 检查是否包含特殊字符 let specialCharRegex = ".*[!@#$%^&*()_+\\\\-=\\\\[\\\\]{};':\\"\\\\\\\\|,./<>?]+.*" let specialPredicate = NSPredicate(format: "SELF MATCHES %@", specialCharRegex) guard specialPredicate.evaluate(with: password) else { return false } return true}
print(isValidPassword("Pass123!")) // trueprint(isValidPassword("weak")) // false示例 3:使用 Validator 库(Adamwaite)
Validator 库提供了便捷的链式规则语法。
import Validator
let emailRule = ValidationRulePattern(pattern: EmailValidationPattern.standard, error: "无效的电子邮件")let emailResult = "user@domain.com".validate(rule: emailRule)
switch emailResult {case .valid: print("电子邮件有效")case .invalid(let errors): print("错误:\\(errors.first?.message ?? "")")}示例 4:用于验证年龄的自定义验证器
有时需要检查用户是否超过特定年龄。
struct AgeValidator { static func isValid(age: Int) -> Bool { return age >= 18 && age <= 120 }}
// 使用let userAge = 25if AgeValidator.isValid(age: userAge) { print(