Валидация данных в Swift (iOS/macOS): библиотеки и подходы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Валидация данных в 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)                    

Рекомендаций