Swift Pills

Dosis rápidas de conocimiento sobre Swift y desarrollo en ecosistemas Apple

¿Confundes .count con .length o usas métodos de NSString en Swift? Estos errores pueden hacer añicos tu app

🚨 El manejo de cadenas en Swift tiene trampas que muchos desarrolladores pisan constantemente. La mayoría provienen de mezclar métodos de Objective-C con tipos nativos de Swift, generando bugs extraños con emojis y caracteres Unicode.

⚠️ El error más común es usar replacingOccurrences(of:with:) en lugar de replacing(_:with:). El primero viene de NSString y no respeta las secuencias Unicode. Puede convertir 🇨🇦🇺🇸 en 🇨🇳🇮🇸 sin previo aviso al romper los indicadores regionales.

📏 Otro error crítico es confundir String.count con NSString.length. El emoji 😘 cuenta como 1 carácter en Swift pero como 2 en NSString. Esto causa desbordamientos de búfer cuando pasas rangos entre ambos tipos de datos.

🎯 Cuando trabajas con NSRegularExpression, NSDataDetector o UITextChecker debes usar utf16.count en lugar de count. Estas APIs de Objective-C usan UTF-16 y si usas count perderás caracteres en el camino.

🧩 flatMap vs compactMap es otra fuente de confusión. En Swift 4.1 se deprecó una sobrecarga de flatMap que manejaba opcionales, introduciendo compactMap para ese propósito. Usar el método equivocado genera resultados inesperados.

👥 Los emojis compuestos como 👨‍❤️‍💋‍👨 usan secuencias ZWJ (Zero-Width Joiner). Swift los trata como un Character, pero algunas APIs los descomponen. Esto rompe la lógica si cuentas caracteres o extraes substrings.

💡 Swift usa grafemas extendidos para representar caracteres, que es la forma correcta de ver lo que un usuario percibe. La letra é puede ser un código (U+00E9) o dos (e + acento combinado U+0301), pero Swift los trata igual.

🔄 Los modificadores de tono de piel en emojis (👍🏿) son caracteres separados que modifican al anterior. Swift 4+ los maneja correctamente gracias a Unicode 9, pero versiones antiguas o uso incorrecto de APIs los cuentan mal.

🛠️ La regla de oro es simple: usa métodos nativos de Swift siempre que puedas. Usa .count en lugar de .length, replacing en lugar de replacingOccurrences, y entiende cuándo necesitas utf16.count para interoperar con Objective-C.

👨‍💻 El manejo correcto de Unicode no es un detalle menor cuando tus usuarios escriben en árabe, japonés o simplemente usan emojis. ¿Has encontrado bugs relacionados con esto en tus proyectos?

Posted in

Deja un comentario