String en Int dans Swift : du simple au performant
\n\nChaque développeur iOS rencontre tôt ou tard une tâche simple en apparence : transformer une chaîne en nombre. Rien de plus simple, semble-t-il — Int("42") et le tour est joué. Mais lorsque l'application traite des milliers de chaînes, analyse un fichier JSON ou lit une saisie utilisateur, la performance de cette opération devient critique.
Dans cet article, nous ne montrerons pas seulement comment convertir String en Int dans Swift, mais nous mènerons une véritable enquête : quelle méthode est la plus rapide, quels pièges se cachent derrière un code simple et comment écrire du code optimisé en Swift qui ne vous décevra pas en production.
\n\nLe contenu est basé sur une question populaire de Stack Overflow (des milliers de vues) et adapté pour le portail éducatif PythonLib. C'est parti !
\n\n1. Méthode de base : Int(string)
\n\nLa méthode la plus évidente et recommandée par Apple est d'utiliser l'initialiseur Int(String). Il retourne une valeur optionnelle Int?, ce qui est sûr : si la chaîne n'est pas un nombre, vous obtenez nil.
let stringNumber = "123"\nif let number = Int(stringNumber) {\n print("Nombre : \\(number)")\n} else {\n print("Échec de la conversion")\n}\n\nAvantages :
\n- \n
- Lisibilité du code — la meilleure de toutes les options. \n
- Sécurité — l'optionnel protège des crashs. \n
- Prise en charge de différentes bases numériques :
Int("FF", radix: 16). \n
Inconvénients :
\n- \n
- Performance — peut être un goulot d'étranglement pour les opérations en masse. \n
- Ne gère pas les espaces, les symboles monétaires, les nombres localisés. \n
Cette méthode est idéale pour 90 % des cas. Mais si vous écrivez un analyseur de logs ou traitez des fichiers CSV d'un million de lignes — lisez la suite.
\n\n2. Utilisation de NumberFormatter : pour les chaînes « sales »
\n\nLe monde réel n'est pas parfait. Un utilisateur peut saisir " 42 ", "$100" ou "1 234.56". C'est là que NumberFormatter entre en jeu — un outil puissant mais lent.
let formatter = NumberFormatter()\nformatter.numberStyle = .decimal\n\nif let number = formatter.number(from: " 1 234 ")?.intValue {\n print(number) // 1234\n}\n\nQuand l'utiliser :
\n- \n
- Analyse de nombres localisés (format européen "1.234,56"). \n
- Chaînes avec espaces, devises, pourcentages. \n
- Champs de saisie UI où l'utilisateur peut entrer n'importe quoi. \n
Cependant, rappelez-vous : NumberFormatter est un poids lourd. Sa création est coûteuse, donc mettez toujours l'instance en cache comme variable statique, plutôt que de la recréer pour chaque chaîne.
3. Scanner (NSScanner) — ancien mais rapide
\n\nL'approche classique d'Objective-C — Scanner. Il est plus rapide que NumberFormatter, mais nécessite de la prudence.
let scanner = Scanner(string: "123abc")\nvar intValue: Int = 0\nif scanner.scanInt(&intValue) {\n print("Trouvé : \\(intValue)") // 123\n}\n\nScanner analyse la chaîne de gauche à droite et s'arrête au premier caractère non numérique. C'est pratique si vous devez « extraire » un nombre d'une chaîne contenant des déchets.
\n\nIndice de benchmark : Scanner est 3 à 5 fois plus rapide que NumberFormatter, mais 2 à 3 fois plus lent que le simple Int(). Idéal pour l'analyse de données mixtes.
4. Fonction personnalisée : analyse manuelle pour une vitesse maximale
\n\nSi vous lisez cet article sur PythonLib, vous savez probablement : quand la vitesse compte, on écrit à la main. Pour les chaînes numériques pures (uniquement les caractères 0-9, éventuellement un moins), on peut écrire son propre analyseur.
\n\nfunc fastInt(from string: String) -> Int? {\n var result = 0\n var isNegative = false\n var started