Validación de datos en Swift (iOS/macOS): revisión de herramientas y bibliotecas
La validación de datos es uno de los aspectos clave en el desarrollo de aplicaciones móviles y de escritorio de calidad en Swift. Permite garantizar que los datos ingresados por el usuario cumplan con el formato esperado y las reglas de negocio. En este artículo, analizaremos los enfoques principales, los mecanismos integrados y las bibliotecas populares para la validación en el ecosistema de Apple.
¿Por qué es importante la validación?
Sin validación, la aplicación corre el riesgo de recibir datos incorrectos, lo que puede provocar:
- Errores en el funcionamiento del backend
- Fallos inesperados (crash) en el lado del cliente
- Vulnerabilidades de seguridad (inyección SQL, XSS)
- Mala experiencia de usuario
Capacidades integradas de Swift y Foundation
Swift y el framework Foundation proporcionan herramientas básicas pero potentes para la validación.
1. Validación con NSPredicate
NSPredicate es una herramienta potente para filtrar y validar datos. Soporta expresiones regulares, lo que lo hace útil para validar email, teléfonos y otras cadenas.
import Foundation
func isValidEmail(_ email: String) -> Bool { let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,64}" let predicate = NSPredicate(format:"SELF MATCHES %@", emailRegEx) return predicate.evaluate(with: email)}
// Ejemplo de usolet testEmail = "user@example.com"print(isValidEmail(testEmail)) // true2. Validación con NSRegularExpression
Para escenarios más complejos, es conveniente usar NSRegularExpression.
func isValidPassword(_ password: String) -> Bool { // Mínimo 8 caracteres, una mayúscula, una minúscula, un dígito let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)[a-zA-Z\\\\d]{8,}$" do { let regex = try NSRegularExpression(pattern: passwordRegex) let range = NSRange(location: 0, length: password.utf16.count) return regex.firstMatch(in: password, options: [], range: range) != nil } catch { return false }}
print(isValidPassword("Swift1234")) // trueprint(isValidPassword("swift123")) // false (sin mayúscula)Bibliotecas populares para validación
Aunque las herramientas integradas son suficientes para tareas simples, para formularios complejos con múltiples reglas es más conveniente usar bibliotecas especializadas.
1. Validator (de Adam Waite)
Una de las bibliotecas más populares para la validación de cadenas en Swift. Soporta cadenas de reglas (chain validation) y validadores personalizados.
// Instalación con SPM: .package(url: "https://github.com/adamwaite/Validator.git", from: "3.0.0")import Validator
let emailRule = ValidationRulePattern(pattern: EmailValidationPattern.standard, error: "Email incorrecto")let nameRule = ValidationRuleLength(min: 2, max: 50, error: "El nombre debe tener entre 2 y 50 caracteres")
let email = "test@mail.ru"let result = email.validate(rule: emailRule)switch result {case .valid: print("Email válido")case .invalid(let errors): print(errors.first?.message ?? "Error")}2. SwiftValidators (de gkaimakas)
Biblioteca ligera con sintaxis declarativa. Ideal para la validación de campos en tiempo real.
import SwiftValidators
let phone = "+7 (999) 123-45-67"if Validator.isPhoneNumber().trim().validate(phone) { print("Teléfono válido")} else { print("Formato incorrecto")}Validación en SwiftUI con Combine
Las aplicaciones modernas en SwiftUI suelen usar Combine para la validación reactiva. Esto permite mostrar errores al instante, a medida que se escribe.
import SwiftUIimport Combine
class RegistrationViewModel: ObservableObject { @Published var email = "" @P