Валидация данных в Swift (iOS/macOS): как выбрать инструмент и не ошибиться
Валидация данных — один из ключевых этапов разработки мобильных и десктопных приложений на Swift. Без неё невозможно гарантировать корректность пользовательского ввода, безопасность данных и стабильную работу приложения. В этой статье мы разберём популярные библиотеки и подходы к валидации в экосистеме Apple, а также приведём примеры кода для iOS и macOS.
Зачем нужна валидация данных в Swift?
Пользователь может ввести всё что угодно: от пустой строки до SQL-инъекции. Валидация помогает:
- предотвратить некорректные данные (email без @, пароль короче 8 символов);
- защитить приложение от атак (XSS, инъекции);
- улучшить UX — мгновенно подсвечивать ошибки;
- соблюдать бизнес-правила (например, возраст > 18 лет).
Популярные библиотеки для валидации в Swift
Хотя в Foundation есть базовые инструменты (NSPredicate, регулярные выражения), для сложных сценариев лучше использовать специализированные библиотеки.
1. Validator (by eMKa)
Одна из самых популярных библиотек с открытым исходным кодом. Поддерживает валидацию строк, чисел, дат, а также кастомные правила.
// Установка через SPM: https://github.com/eMKa/Validator
import Validator
let emailRule = ValidationRulePattern(pattern: EmailValidationPattern.standard)
let result = "test@example.com".validate(rule: emailRule)
switch result {
case .valid:
print("Email корректен")
case .invalid(let errors):
print("Ошибка: \(errors.first?.message ?? "Неизвестная ошибка")")
}
Библиотека поддерживает цепочки правил: "password123".validate(rules: [lengthRule, uppercaseRule, digitRule]). Идеально подходит для форм регистрации.
2. SwiftValidator (by jpotts18)
Лёгкая библиотека для валидации полей ввода. Работает с UIKit и SwiftUI. Позволяет задавать правила для каждого текстового поля.
// Установка: https://github.com/jpotts18/SwiftValidator
import SwiftValidator
let validator = Validator()
validator.registerField(emailTextField, rules: [RequiredRule(), EmailRule()])
validator.registerField(passwordTextField, rules: [RequiredRule(), MinLengthRule(length: 8)])
validator.validate { errors in
if errors.isEmpty {
print("Все поля валидны")
} else {
for (field, error) in errors {
print("Ошибка в \(field): \(error.errorMessage)")
}
}
}
Отлично подходит для форм с большим количеством полей — можно централизованно управлять валидацией.
3. Regex (встроенное решение Foundation)
Если не хотите подключать сторонние зависимости, используйте NSRegularExpression. Подходит для простых проверок.
func isValidEmail(_ email: String) -> Bool {
let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let regex = try? NSRegularExpression(pattern: pattern)
let range = NSRange(location: 0, length: email.utf16.count)
return regex?.firstMatch(in: email, range: range) != nil
}
// Использование
if isValidEmail("user@example.com") {
print("Email валидный")
} else {
print("Неверный формат email")
}
Минус — сложно поддерживать и расширять. Для больших проектов лучше использовать библиотеки.
4. ValidatedPropertyKit (от сообщества)
Современный подход с использованием property wrappers. Позволяет аннотировать свойства модели напрямую.
// Установка: https://github.com/SvenTiigi/ValidatedPropertyKit
import ValidatedPropertyKit
struct User {
@Validated(.nonEmpty, .email) var email: String
@Validated(.minLength(8), .containsUppercase) var password: String
}
var user = User()
user.email = "test" // Ошибка: невалидный email
user.password = "weak" // Ошибка: слишком короткий пароль
print(user.$email.errors) // Выведет список ошибок
Минус — требует iOS 14+ и Swift 5.3. Зато код становится декларативным и читаемым.
Пример: комплексная валидация формы регистрации на SwiftUI
Покажем, как объединить несколько подходов в одном приложении для macOS/iOS.
import SwiftUI
import Validator
struct RegistrationView: View {
@State private var email = ""
@State private var password = ""
@State private var age = ""
@State private var errorMessage = ""
var body: some View {
Form {
TextField Также в библиотеке
PDF генерация в Go (Golang): библиотеки и примеры
Реактивное программирование в Java: библиотека Reactor
Работа с Apache Kafka в Swift (iOS/macOS): библиотеки и примеры
Отправка SMS на Swift (iOS/macOS): API MessageUI и сторонние сервисы