« Et où est mon .trim() ? » — ou pourquoi Swift n'est pas Python
\n\nSi vous venez à Swift depuis Python ou JavaScript, vous êtes probablement habitué à l'appel simple " hello ".trim() ou " hello ".strip(). Et voilà que vous écrivez votre premier code en Swift, vous essayez de faire la même chose — et vous obtenez une erreur de compilation. Une situation familière ?
Sur Stack Overflow, cette question a recueilli des milliers de vues, et ce n'est pas pour rien. En Swift, il n'y a pas de méthode .trim() pour les chaînes. Mais cela ne signifie pas que vous ne pouvez pas supprimer les espaces et les caractères. L'approche est simplement différente — plus Swift-way. Démêlons cela une fois pour toutes.
Dans cet article, nous ne répondrons pas seulement à la question principale, mais nous montrerons également des exemples de code réels que vous pourrez immédiatement insérer dans votre projet. C'est parti !
\n\nRéponse courte : oui, mais pas comme vous en avez l'habitude
\n\nEn Swift, il n'y a pas de méthode unique .trim(). À la place, on utilise une famille de méthodes du protocole Foundation :
- \n
trimmingCharacters(in:)— l'outil principal \n .trimmingCharacters(in: .whitespacesAndNewlines)— la variante la plus populaire \n
Cela semble laconique ? En pratique, cela offre une flexibilité : vous décidez vous-même quels caractères vous souhaitez supprimer, sans compter sur la « magie » d'une méthode intégrée.
\n\nComment fonctionne trimmingCharacters — analyse avec des exemples
\n\nExemple de base : suppression des espaces et des sauts de ligne
\n\nimport Foundation\n\nlet text = " Bonjour, Swift ! \\n"\nlet trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines)\nprint(trimmed) // "Bonjour, Swift !"\n\nNotez que nous devons importer Foundation. Sans cela, la méthode n'est pas disponible, car elle est définie dans NSString, qui est « injecté » dans la chaîne Swift via un pont.
Uniquement les espaces (sans supprimer les sauts de ligne)
\n\nlet textWithNewline = " Bonjour\\n"\nlet onlySpacesTrimmed = textWithNewline.trimmingCharacters(in: .whitespaces)\nprint(onlySpacesTrimmed) // "Bonjour\\n"\n\nVous voyez ? Le saut de ligne est resté. C'est pratique lorsque vous souhaitez conserver le formatage, mais supprimer les espaces superflus sur les bords.
\n\nDécoupage de caractères arbitraires
\n\nDans CharacterSet, vous pouvez passer n'importe quel ensemble :
let email = " user@example.com "\nlet cleaned = email.trimmingCharacters(in: .whitespaces)\nprint(cleaned) // "user@example.com"\n\nlet price = "$99.99"\nlet noDollar = price.trimmingCharacters(in: CharacterSet(charactersIn: "$"))\nprint(noDollar) // "99.99"\n\nEt qu'en est-il de trimLeft / trimRight (ltrim / rtrim) ?
\n\nEn Python, il y a .lstrip() et .rstrip(). En Swift — non. Mais cela se réalise facilement manuellement. Voici deux extensions simples que vous pouvez ajouter à votre projet :
import Foundation\n\nextension String {\n func trimmingLeft(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {\n var start = startIndex\n while start < endIndex, characterSet.contains(self[start].unicodeScalars.first!) {\n formIndex(after: &start)\n }\n return String(self[start..<endIndex])\n }\n \n func trimmingRight(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {\n var end = endIndex\n while end > startIndex, characterSet.contains(self[index(before: end)].unicodeScalars.first!) {\n formIndex(before: &end)\n }\n return String(self[startIndex..<end])\n }\n}\n\n// Exemple d'utilisation :\nlet text = " Hello World "\nprint(text.trimmingLeft()) // "Hello World "\nprint(text.trimmingRight()) // " Hello World"\n\nVous avez maintenant des trimLeft et trimRight complets, comme dans votre Python préféré. Sauvegardez ce code dans un fichier séparé — il vous sera utile.