Валидация данных в Swift (iOS/macOS): лучшие практики и инструменты

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

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

Начать курс

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

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