Validação de dados em Swift (iOS/macOS): como escolher a ferramenta e não errar
A validação de dados é uma das etapas essenciais no desenvolvimento de aplicativos móveis e desktop em Swift. Sem ela, é impossível garantir a correção da entrada do usuário, a segurança dos dados e o funcionamento estável do aplicativo. Neste artigo, vamos explorar bibliotecas e abordagens populares para validação no ecossistema Apple, além de fornecer exemplos de código para iOS e macOS.
Por que a validação de dados em Swift é necessária?
O usuário pode inserir qualquer coisa: desde uma string vazia até uma injeção SQL. A validação ajuda a:
- prevenir dados incorretos (email sem @, senha com menos de 8 caracteres);
- proteger o aplicativo contra ataques (XSS, injeções);
- melhorar a UX — destacar erros instantaneamente;
- cumprir regras de negócio (por exemplo, idade > 18 anos).
Bibliotecas populares para validação em Swift
Embora o Foundation tenha ferramentas básicas (NSPredicate, expressões regulares), para cenários complexos é melhor usar bibliotecas especializadas.
1. Validator (por eMKa)
Uma das bibliotecas de código aberto mais populares. Suporta validação de strings, números, datas e regras personalizadas.
// Instalação via SPM: https://github.com/eMKa/Validatorimport Validator
let emailRule = ValidationRulePattern(pattern: EmailValidationPattern.standard)let result = "test@example.com".validate(rule: emailRule)switch result {case .valid: print("Email válido")case .invalid(let errors): print("Erro: \\(errors.first?.message ?? "Erro desconhecido")")}A biblioteca suporta encadeamento de regras: "password123".validate(rules: [lengthRule, uppercaseRule, digitRule]). Ideal para formulários de registro.
2. SwiftValidator (por jpotts18)
Uma biblioteca leve para validação de campos de entrada. Funciona com UIKit e SwiftUI. Permite definir regras para cada campo de texto.
// Instalação: https://github.com/jpotts18/SwiftValidatorimport 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("Todos os campos são válidos") } else { for (field, error) in errors { print("Erro em \\(field): \\(error.errorMessage)") } }}Excelente para formulários com muitos campos — permite gerenciar a validação de forma centralizada.
3. Regex (solução integrada do Foundation)
Se não quiser adicionar dependências externas, use NSRegularExpression. Adequado para verificações simples.
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}
// Usoif isValidEmail("user@example.com") { print("Email válido")} else { print("Formato de email inválido")}Desvantagem: difícil de manter e estender. Para projetos grandes, é melhor usar bibliotecas.
4. ValidatedPropertyKit (da comunidade)
Uma abordagem moderna usando property wrappers. Permite anotar propriedades do modelo diretamente.
// Instalação: https://github.com/SvenTiigi/ValidatedPropertyKitimport ValidatedPropertyKit
struct User { @Validated(.nonEmpty, .email) var email: String @Validated(.minLength(8), .containsUppercase) var password: String}
var user = User()user.email = "test" // Erro: email inválidouser.password = "weak" // Erro: senha muito curtaprint(us