Валидация данных в Swift (iOS/macOS): библиотеки, инструменты и практические примеры
Валидация данных — один из ключевых аспектов разработки качественных iOS и macOS приложений. Без надёжной проверки вводимых данных пользователь может столкнуться с ошибками, некорректным поведением интерфейса или даже сбоями. В этой статье мы рассмотрим лучшие библиотеки и подходы для валидации данных в Swift, а также приведём конкретные примеры кода.
Зачем нужна валидация данных?
Валидация позволяет:
- Гарантировать корректность вводимых данных (email, телефон, пароль).
- Предотвратить ошибки на серверной стороне.
- Улучшить пользовательский опыт за счёт мгновенной обратной связи.
- Повысить безопасность приложения.
Популярные библиотеки для валидации в Swift
На сегодняшний день существует несколько проверенных библиотек, которые упрощают валидацию данных:
- Validated — лёгкая библиотека с поддержкой Combine и SwiftUI.
- SwiftValidator — одна из первых библиотек для валидации текстовых полей.
- Validator (от Adamwaite) — простой и гибкий инструмент с множеством встроенных правил.
- Regex — не библиотека, а встроенный механизм для работы с регулярными выражениями, который часто используется для валидации.
Пример 1: Валидация email с помощью регулярного выражения
Самый простой способ — использовать 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")) // true
print(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!")) // true
print(isValidPassword("weak")) // false
Пример 3: Использование библиотеки Validator (Adamwaite)
Библиотека Validator предоставляет удобный синтаксис для цепочек правил.
import Validator
let emailRule = ValidationRulePattern(pattern: EmailValidationPattern.standard, error: "Некорректный email")
let emailResult = "user@domain.com".validate(rule: emailRule)
switch emailResult {
case .valid:
print("Email корректен")
case .invalid(let errors):
print("Ошибка: \(errors.first?.message ?? "")")
}
Пример 4: Кастомный валидатор для проверки возраста
Иногда требуется проверить, что пользователь старше определённого возраста.
struct AgeValidator {
static func isValid(age: Int) -> Bool {
return age >= 18 && age <= 120
}
}
// Использование
let userAge = 25
if AgeValidator.isValid(age: userAge) {
print("Возраст корректен")
} else {
print("Возраст должен быть от 18 до 120 лет")
}
Пример 5: Валидация в SwiftUI с использованием Combine
Современные приложения на SwiftUI требуют реактивной валидации.
import SwiftUI
import Combine
class RegistrationViewModel: ObservableObject {
@Published var email = ""
@Published var password = ""
@Published var isFormValid = false
private var cancellables = Set<AnyCancellable>()
init() {
Publishers.CombineLatest($email, $password) Также в библиотеке
Redis клиент для C++: подключение, установка и примеры использования
Работа с S3 и облачными хранилищами в C++: библиотека AWS SDK для C++
Работа с датами в Kotlin: библиотеки и инструменты (Kotlinx-datetime, Joda-Time, java.time)
ORM для Go (Golang): сравнение и примеры популярных библиотек